[英]Get Typescript to infer a union type
我正在嘗試創建一個相對簡單的 function 簽名,如下所示:
function<U>(...args:U[]):U {/* body */}
我希望 typescript 將傳遞給聯合的參數的類型組合起來,而不是簡單地將 U 推斷為第一個參數的類型。 請問我怎么會 go 關於這個?
您遇到的問題是以下代碼會產生編譯器錯誤:
function f<U>(...args: U[]): U {
return args[Math.floor(Math.random() * args.length)]
}
const a = f("string", 123, true); // error!
// ~~~ <-- error! 123 is not a string
// U inferred as string
// const a: string
編譯器啟發式阻止在這里推斷聯合,因為人們經常希望發生這種錯誤。 請參閱為什么不將類型參數推斷為聯合類型? 了解更多信息。
在microsoft/TypeScript#44312有一個開放功能請求,要求以某種方式告訴編譯器您想要聯合而不是錯誤。 目前這是不可能的,所以如果你想要類似的行為,你需要使用變通方法。
一種常見的解決方法是更改 function 以便它不是在args
元素的類型U
中通用,而是在args
本身的數組類型T
中通用。 從那里,您可以使用number
索引到該類型以獲取元素類型。 也就是說,如果T
是類數組類型,則T[number]
是元素類型(因為這是使用number
索引數組時得到的類型):
function f<T extends any[]>(...args: T): T[number] {
return args[Math.floor(Math.random() * args.length)]
}
const a = f("string", 123, true);
// T inferred as [string, number, boolean]
// const a: string | number | boolean
現在沒有錯誤了, a
的類型就是你想要的 union。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.