如何在打字稿方法中推断出通用返回值?

时间:2019-09-08 22:37:31

标签: typescript typescript-generics

我想更好地理解打字稿如何通过泛型来推断返回类型。如果在没有泛型类型参数的情况下调用使用泛型类型作为返回值的方法,那么如何通过typescript推断出返回类型?我知道可以通过发送的类型轻松推断出通用的参数,但是如果没有提供通用的类型参数,则无法推断出返回参数。

// Call: 
this.getSomething(value);

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

1 个答案:

答案 0 :(得分:1)

让我们考虑使用getSomething()方法:

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

您没有在其中显示实现,所以我不确定它在做什么。但是签名本身值得怀疑... getSomething()声称它可以为调用者选择的任何类型返回T 类型的值(或编译器为调用者推断的类型) ),仅输入string。这不太可能是正确的,或者至少不能轻易验证其类型安全。

我的意思是,没有什么阻止我写this.getSomething<string>("abc")然后写this.getSomething<number>("abc")。但是由于类型系统是将TypeScript编译为JavaScript的erased,因此这两个调用都将像this.getSomething("abc")一样发出。对于两个调用来说,结果可能都是相同的,并且由于不可能在两者string 和{{1}这些TypeScript调用中至少有一个是错误的。


但是,让我们继续陈述您的问题:

如果仅调用number,则推断可能会失败,并且this.getSomething(value)将变为Tunknown depending on the version of TypeScript you're using

{}

如果您致电const hmm = this.getSomething("value"); // const hmm: unknown // inference fails, T inferred as unknown ,它将使用contextual typing  的const t: string = this.getSomething(value)中,以决定t必须为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的好方法。


好的,希望能有所帮助。祝好运!

Link to code