Typy warunkowe

Typy wybierane na podstawie warunku: T extends U ? X : Y.

Na tej stronie

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 : TypGdyNie

Więcej przykładów

#
Typ zależny od argumentu
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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.