TypeScriptGeneryki i typy zaawansowane
Typy warunkowe
Typy wybierane na podstawie warunku: T extends U ? X : Y.
Przykład
#TypeScript
type Label<T> = T extends string ? 'tekst' : T extends number ? 'liczba' : 'coś innego'
type A = Label<'html'>
// type A = "tekst"
type B = Label<42>
// type B = "liczba"
type C = Label<boolean>
// type C = "coś innego"
type OnlyStrings<T> = T extends string ? T : never
type Mixed = OnlyStrings<'a' | 1 | 'b' | true>
// type Mixed = "a" | "b"Definicja i zastosowanie
#Typ warunkowy działa jak operator trójargumentowy, ale na typach: T extends string ? "tekst" : "inne". Jeśli T jest zgodny z string, wynikiem jest pierwszy typ, w przeciwnym razie drugi.
Gdy T jest unią, warunek stosuje się do każdego jej członu osobno (rozdzielnie). Dzięki temu łatwo odfiltrować z unii niechciane typy, zwracając dla nich never. Tak działają wbudowane Exclude i Extract.
Typy warunkowe są podstawą wielu typów narzędziowych i bibliotek. W kodzie aplikacji pojawiają się rzadziej, ale warto je rozumieć, żeby czytać definicje typów.
Składnia
#Składnia
type Wynik<T> = T extends Warunek ? TypGdyTak : TypGdyNieWięcej przykładów
#TypeScript
function parse<T extends 'number' | 'boolean'>(value: string, as: T): T extends 'number' ? number : boolean {
return (as === 'number' ? Number(value) : value === 'true') as T extends 'number' ? number : boolean
}
console.log(parse('42', 'number') + 1)
console.log(parse('true', 'boolean'))Wynik
43 true
Dobre praktyki
#- Jeśli typ warunkowy robi się długi, rozbij go na kilka nazwanych typów pomocniczych.
- Rozdzielanie po unii można wyłączyć, ujmując typ w nawiasy kwadratowe:
[T] extends [string].
Powiązane hasła
#- inferWyciąga typ z wnętrza innego typu w typie warunkowym.
- Exclude<UnionType, ExcludedMembers>Usuwa z unii typy zgodne z podanym typem.
- Extract<Type, Union>Zostawia w unii tylko typy zgodne z podanym typem.
- neverTyp wartości, która nigdy nie wystąpi: funkcji, które nie kończą się normalnie, i niemożliwych przypadków.
- Typy mapowaneTworzą nowy typ obiektu, przekształcając każdy klucz innego typu.
Widzisz błąd albo brakuje przykładu? Napisz do nas.