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