簡體   English   中英

Typescript - 按元素類型過濾通用數組類型

[英]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的結果類型不是元組,而是具有兩個屬性13object類型。

要獲得元組類型作為結果,您需要遞歸類型。

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.

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