如何参数化泛型函数参数?

问题描述 投票:0回答:1

例如,我在类中有一个通用静态方法,并且想要在给定通用参数的情况下获取其参数类型:

class Model{
    id = 0;
    title = 'test';
}

class Child extends Model{
    child = true;
}

class Foo {

    static func<T extends Model>(a: Omit<T, 'id'>): number{
        return 0;
    }

}

type p = Parameters<typeof Foo['func']>[0] // how to get Child here?

有什么办法可以实现这一点吗?有正确的语法吗?

游乐场

我已经尝试过了

Parameters<typeof Foo['func']<Child>>[0]

但这会产生语法错误...

typescript
1个回答
0
投票

在 TypeScript 中,当你有一个泛型函数并且想要获取具有特定类型参数的参数类型时,在使用

typeof
时不能直接指定类型参数。也就是说,编写
typeof
Foo['func']<Child>
会导致语法错误,因为 TypeScript 不支持在类型查询中应用类型参数。

您可以创建一个辅助类型来重建函数类型,并将泛型参数替换为您想要的特定类型。通过使用条件类型和

infer
关键字,您可以从原始函数中提取参数和返回类型,然后将泛型类型参数
T
替换为您想要的类型。

type SpecializedFooFunc<T extends Model> =
    typeof Foo.func extends (a: Omit<infer U, 'id'>) => infer R
        ? (a: Omit<T, 'id'>) => R
        : never;

type p = Parameters<SpecializedFooFunc<Child>>[0];
© www.soinside.com 2019 - 2024. All rights reserved.