【问题标题】:How are generic return values inferred in typescript methods?打字稿方法中如何推断通用返回值?
【发布时间】:2020-01-10 18:18:13
【问题描述】:

我想更好地了解 typescript 如何使用泛型推断返回类型。如果在没有泛型类型参数的情况下调用使用泛型类型作为返回值的方法,打字稿如何推断返回类型?我知道泛型参数可以很容易地通过传入的类型来推断,但如果没有提供泛型类型参数,则无法推断返回参数的方式。

// Call: 
this.getSomething(value);

// Method signature:
getSomething<T>(inParameter: string): T { 
    ...
}

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    让我们考虑getSomething() 方法:

    getSomething<T>(inParameter: string): T {
      return null!; // <-- this isn't safe, whatever you put here
    }
    

    你没有在那里展示实现,所以我不确定它认为它在做什么。但是签名本身是可疑的...getSomething() 声称它可以返回类型为 T 调用者选择的任何类型(或编译器为调用者推断)的值,只有string 输入。这不太可能是真的,或者至少不能轻易地被验证为类型安全。

    我的意思是,没有什么能阻止我写this.getSomething&lt;string&gt;("abc")this.getSomething&lt;number&gt;("abc")。但是由于在将 TypeScript 编译为 JavaScript 时类型系统是 erased,因此这两个调用都将作为 this.getSomething("abc") 发出。可能这两个调用的结果相同,并且由于该结果不可能 bothstring number,至少其中一个TypeScript 调用错误。


    但是,让我们继续讨论您的问题:

    如果您只调用this.getSomething(value),推理可能会失败,T 将变为{}unknown depending on the version of TypeScript you're using

    const hmm = this.getSomething("value"); // const hmm: unknown
    // inference fails, T inferred as unknown
    

    如果您调用const t: string = this.getSomething(value),它将使用contextual typingt 决定T 必须是string

    const t: string = this.getSomething("value");
    // contextual typing, T is inferred as string
    

    但如果调用者提供T 类型的参数或本身可能产生T 类型的值的东西,这对安全和推理都更好。例如:

    getSomethingReasonable<T>(inParameter: string, tArray: T[]): T {
      return tArray[inParameter.length];
    }
    
    const okay = this.getSomethingReasonable("value", [1,2,3,4,5,6,7,8]);   
    // inference on tArray, T is number
    

    它更安全,因为输入 tArray 提供了一种运行时机制来生成 T 类型的值,即使使用类型擦除也是如此。而且,正如您所指出的,这是推断T 的好方法。


    好的,希望对您有所帮助。祝你好运!

    Link to code

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多