[英]Typescript function using generics and rest properties doesn't automatic collect all possible types
請參閱下面的最低代碼。
function zip<T>(...arrs: T[][]): T[][] {
return arrs
}
zip([1,2,3], ['a', 'b', 'c'])
// Type 'string' is not assignable to type 'number'.ts(2322)
zip<number | string>([1,2,3], ['a', 'b', 'c'])
// Ok, but a little bit bother to me.
我使用generics
和rest
屬性創建了一個函數。
當我直接使用zip([1,2,3], ['a', 'b', 'c'])
,我希望打字稿會自動發現我正在使用number | string
number | string
類型,有什么方法可以實現嗎?
Typescript 看到第一個參數是number[]
並且這修復了T
然后你會得到第二個錯誤。 雖然理論上T
可以推斷為string | number
string | number
我認為當前的行為通常是一件好事,它更可能infering工會將導致其他地方發生意外錯誤。
如果您讓編譯器將所有參數作為一個整體而不是單獨考慮,在其余參數中使用元組,您可以讓編譯器接受您想要的調用:
function zip<T extends any[][]>(...arrs: T): (T[number][number])[][] {
return arrs
}
zip([1,2,3], ['a', 'b', 'c'])
T
將是示例調用的元組類型( [number[], string[]]
,因此要獲取項目類型,我們使用T[number][number]
(這將是示例調用的string | number
),並且使用[][]
返回數組數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.