![](/img/trans.png)
[英]How to fix generic TypeScript function to return valid inferred type?
[英]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.