[英]Typescript - Filter a generic array type by element type
我有一個值數組:
const array = ['b', 'a', 'b', 'a', 'c'] as const;
所以類型是:
const array: readonly ["b", "a", "b", "a", "c"]
現在我想創建一個過濾數組的類型,並返回一種只包含過濾元素的數組。 我創建了一個FilterArray
類型,它可以解決問題,但是,數組上的索引取自第一個數組並且沒有重新啟動。
type FilterArray<T extends readonly any[], V> = {
[I in keyof T as [Extract<T[I], V>] extends [never] ? never : I]: T[I];
}
如果我現在過濾typeof array
,我會得到以下結果:
filteredArray[3]
也是 'a' 類型,這是正確的。
是否可以從0重新啟動索引? 還是我應該采取另一種方法?
這里的問題是您正在使用帶有鍵重新映射的映射類型。 由於鍵重映射, FilterArray
的結果類型不是元組,而是具有兩個屬性1
和3
的object類型。
要獲得元組類型作為結果,您需要遞歸類型。
type FilterArray<T extends readonly any[], V> =
T extends readonly [infer L, ...infer R]
? L extends V
? [L, ...FilterArray<R, V>]
: [...FilterArray<R, V>]
: []
此類型遍歷數組並將匹配元素添加到 output。
結果類型現在看起來像這樣:
const filteredArray = {} as FilterArray<typeof array, "a">
// ^? ["a", "a"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.