簡體   English   中英

打字稿將元組的類型元組轉換為元組(扁平元組)

[英]Typescript convert type Tuple of tuple to Tuple (flatten Tuple)

我有這個

Type T = Params<[Tuple1, Tuple2]> // eg [[string], [number]]

制作方法(壓扁)

Type Flatten<T> = Params<[string, number]> 

我們可以通過映射類型來做到這一點。 考慮代碼:

type T = Params<[Tuple1, Tuple2]>

// utility type
type Flatten<T extends any[]> = {
  [K in keyof T]: T[K] extends any[] ? T[K][0] : T[K]
}
type Result = Flatten<T>
// evaluates into [string, number]

const a: Result = ['a', 1] // correct value of the type

注意Flatten工作原理:

  • [K in keyof T] - 意味着我們想要所有的鍵,所以在元組中說元素
  • T[K] extends any[] ? T[K][0] : T[K] T[K] extends any[] ? T[K][0] : T[K] - 我們說如果給定鍵上的元素的值是一個數組,那么給我這個數組的第一個元素的類型(索引 0),如果不是,則將其保留為是,因為沒有什么可以壓平的

如果您的元組考慮了不止一種類型的元素,那么上述解決方案將僅采用第一種。 所以對於元組[string, number]它將產生string 如果我們想在元組中收集所有可能的類型,我們可以創建更復雜的類型。 考慮:

type Flatten<T extends any[]> = {
  [K in keyof T]: T[K] extends any[] ? T[K][Exclude<keyof T[K], keyof any[]>] : T[K]
}
  • T[K] extends any[] ? T[K][Exclude<keyof T[K], keyof any[]>] : T[K] T[K] extends any[] ? T[K][Exclude<keyof T[K], keyof any[]>] : T[K]意味着如果我們的元素是一個數組,則獲取所有元素的類型,但刪除數組原型中的值類型。

在結果Flatten<Params<[string, number]>>將產生[string | number] [string | number] 所以這取決於你的目標是什么。


最后一個命題是,如果不考慮其他類型而只考慮嵌套數組/元組,我們可以避免條件類型。 考慮最后一個解決方案:

type Flatten<T extends E[], E extends any[] = any[]> = {
  [K in keyof T]: T[K][Exclude<keyof T[K], keyof any[]>]
}

上述類型更受限制,因為它僅適用於[[]]但更簡潔和具體。

暫無
暫無

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

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