在 TypeScript 中,如何在具有多个类型参数的方法中推断出泛型类型参数?
In TypeScript, how can i get a generic type parameter to be inferred in a method that has multiple type parameters?
我试图在下面的示例中正确推断 T3
的类型,但它只是显示为 unknown
。我不明白它如何在调用 Testing.testIt
时正确推断基本类型 T2
,而不是它扩展的 class (T3
) 的类型参数。这里是running example。我试图弄清楚 infer
关键字在这里是否有用,但我看不出它如何适合这个。
export interface Type<T> extends Function {
new (...args: any[]): T;
}
class GenericClass<T> {
}
class ChildClass extends GenericClass<string> {
}
class Testing {
static testIt<T3, T2 extends GenericClass<T3>>(testClass: Type<T2>): T3 {
console.log('testIt called');
return '' as any;
}
static testIt2(val: string): void {
console.log(val);
}
}
const result = Testing.testIt(ChildClass);
Testing.testIt2(result);
您需要定义一个助手来提取类型:
type ExtractGenericClassType<T> = T extends GenericClass<infer TInner> ? TInner : never;
class Testing {
static testIt<T extends GenericClass<any>>(testClass: Type<T>): ExtractGenericClassType<T> {
...
}
}
此外,你需要确保你的泛型class确实使用了泛型类型参数,否则这将不起作用。
我试图在下面的示例中正确推断 T3
的类型,但它只是显示为 unknown
。我不明白它如何在调用 Testing.testIt
时正确推断基本类型 T2
,而不是它扩展的 class (T3
) 的类型参数。这里是running example。我试图弄清楚 infer
关键字在这里是否有用,但我看不出它如何适合这个。
export interface Type<T> extends Function {
new (...args: any[]): T;
}
class GenericClass<T> {
}
class ChildClass extends GenericClass<string> {
}
class Testing {
static testIt<T3, T2 extends GenericClass<T3>>(testClass: Type<T2>): T3 {
console.log('testIt called');
return '' as any;
}
static testIt2(val: string): void {
console.log(val);
}
}
const result = Testing.testIt(ChildClass);
Testing.testIt2(result);
您需要定义一个助手来提取类型:
type ExtractGenericClassType<T> = T extends GenericClass<infer TInner> ? TInner : never;
class Testing {
static testIt<T extends GenericClass<any>>(testClass: Type<T>): ExtractGenericClassType<T> {
...
}
}
此外,你需要确保你的泛型class确实使用了泛型类型参数,否则这将不起作用。