繁体   English   中英

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

[英]How are generic return values inferred in typescript methods?

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

// Call: 
this.getSomething(value);

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

让我们考虑一下getSomething()方法:

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

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

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


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

如果仅调用this.getSomething(value) ,则推理可能会失败,并且T将变为{}unknown具体取决于您使用的TypeScript的版本

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

如果调用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的值,即使使用类型擦除也是如此。 而且,正如您所指出的,这是推断T的好方法。


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

链接到代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM