簡體   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