Przejdź do treści
Wybierz klucze według typu wartości

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Wzorce

    Jak uzyskać tylko klucze właściwości będących tekstami, funkcjami albo innym wybranym typem?

    Mapuj każdy klucz na niego samego albo `never`, a potem zindeksuj obiekt, by zebrać ocalałe.

    Przepis

    type KeysByValue<T, Value> = {
      [K in keyof T]-?: T[K] extends Value ? K : never
    }[keyof T]
    
    type Model = {
      id: number
      name: string
      email: string
      active: boolean
    }
    
    type TextKeys = KeysByValue<Model, string>

    Build to kompiluje i sprawdza każdy wynik poniżej.

    Jak to działa

    1. 01
      T[K] extends Value ? K : never

      Pasujące właściwości zachowują klucz; pozostałe znikają w `never`.

    2. 02
      }[keyof T]

      Indeksowanie zamienia wyniki właściwości w jedną unię kluczy.

    Co dostajesz

    Gdzie to zawodzi

    Sprawdzenie dotyczy przypisywalności, nie dokładnej równości. Literalna właściwość tekstowa też rozszerza `string`, a właściwość unijna pasuje tylko, gdy cała unia rozszerza żądany typ.

    Wniosek

    Filtrowanie mapowane to mapowanie na klucz-lub-never, a potem indeksowanie w celu zwinięcia wyniku.

    Zobacz też

    Wzorce