让我们考虑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") 发出。可能这两个调用的结果相同,并且由于该结果不可能 both 是 string 和 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 typing
的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 类型的值,即使使用类型擦除也是如此。而且,正如您所指出的,这是推断T 的好方法。
好的,希望对您有所帮助。祝你好运!
Link to code