簡體   English   中英

使用泛型和其余屬性的 Typescript 函數不會自動收集所有可能的類型

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

我使用genericsrest屬性創建了一個函數。

當我直接使用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.

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