TypeScript-获取泛型类参数的类型
我需要实现一个GetClassParameter<T>像这样工作的类型:
class Foo<T> {
}
type foo = Foo<string>
type x = GetClassParameter<foo>; // should be string
很抱歉,如果它是重复的,我找不到它。我只找到了一个硬编码的解决方案(来源):
type GetFooParameter<T extends Foo<any>> = T extends Foo<infer R> ? R : unknown;
我试图做这样的事情:
class Foo<T> {
public value: T;
public value2: string;
constructor (value: T) {
this.value = value;
}
}
type BaseT<T> = {
value: T // if removed, it wouldn't work
}
type GetClassParameter<T extends BaseT<any>> = T extends BaseT<infer R> ? R : unknown;
type x = GetClassParameter<foo> // string - almost works, requires shared property with a T
以上几乎有效,但需要 BaseT 具有value: T属性。
假设目标类只有一个泛型参数,有没有办法在不硬编码任何东西的情况下做到这一点?
更新:
再接再厉,未果。
type ClassLike<T> = (new <T>(...args: any[]) => any);
type GetClassParameter<T extends ClassLike<any>> = T extends ClassLike<infer R> ? R : unknown;
type x = GetClassParameter<foo> // error, does not satisfy constraint
更新 2
目前是不可能的。尽管如此,我还是尝试了一种 hack 方法来定义具有 value 属性的 BaseT,然后将其删除。它不起作用。如果有人有类似的想法以节省您的时间,我会将其添加为参考。操场
更新 3
我正在添加一个变通方法,我使用它来获取 2 个没有共同点的类的类参数类型(只需添加额外的条件,它就可以扩展到涵盖更多类)。
操场
class Alpha<T> {
private a: T;
}
class Beta<T> {
private b: T;
}
type GetClassParameterForAlphaBeta<T extends Alpha<any> | Beta<any>> =
T extends Alpha<infer R>
? R : T extends Beta<infer R>
? R : unknown;
type alpha = Alpha<string>
type beta = Beta<number>
type x = GetClassParameterForAlphaBeta<alpha> // string
type y = GetClassParameterForAlphaBeta<beta> // number