在 TypeScript 中,如何在具有多个类型参数的方法中推断出泛型类型参数?

Posted

技术标签:

【中文标题】在 TypeScript 中,如何在具有多个类型参数的方法中推断出泛型类型参数?【英文标题】:In TypeScript, how can i get a generic type parameter to be inferred in a method that has multiple type parameters? 【发布时间】:2020-03-09 20:05:48 【问题描述】:

我试图在下面的示例中正确推断 T3 的类型,但它只是显示为 unknown。我无法理解它如何在调用Testing.testIt 时正确推断基本类型T2,而不是它扩展的类的类型参数(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);

【问题讨论】:

【参考方案1】:

您需要定义一个帮助器来提取类型:

type ExtractGenericClassType<T> = T extends GenericClass<infer TInner> ? TInner : never;

class Testing 
    static testIt<T extends GenericClass<any>>(testClass: Type<T>): ExtractGenericClassType<T> 
      ...
    

另外,你需要确保你的泛型类确实使用了泛型类型参数,否则这将不起作用。

【讨论】:

好的,谢谢。我尝试了一些非常相似的方法,但我只是不确定在GenericClass 中为类型参数添加什么。不过现在看,我想any 是有道理的,但对我来说还是有点奇怪。 “确保你的泛型类实际使用泛型类型参数”?相关FAQ entry @jcalz 谢谢,我想知道这是否在他们的文档中,我只是不知道要搜索什么才能找到它。

以上是关于在 TypeScript 中,如何在具有多个类型参数的方法中推断出泛型类型参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中键入 Redux 操作和 Redux reducer?

您如何定义具有键字符串索引但具有特定类型的已知键的 TypeScript 接口?

具有多个调用签名的 TypeScript 接口

如何在TypeScript中使用类型保护

盘点 TypeScript 的基础认识 二

盘点 TypeScript 的基础认识 二