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
- 01
T[K] extends Value ? K : never
Pasujące właściwości zachowują klucz; pozostałe znikają w `never`.
- 02
}[keyof T]Indeksowanie zamienia wyniki właściwości w jedną unię kluczy.
Co dostajesz
TextKeys
→"name" | "email"KeysByValue<Model, number>→"id"KeysByValue<Model, Date>
→never
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.
