簡體   English   中英

獲取 Typescript 以推斷聯合類型

[英]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。

Playground 代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM