Przejdź do głównej treści
eLearner.app
Moduł 6 · Lekcja 1 z 211/14 w kursie~15 min
Lekcje modułu (1/2)

Typy Warunkowe i infer

Typy warunkowe pozwalają na wyrażanie niebanalnych decyzji dotyczących typów w oparciu o relacje dziedziczenia. Składnia przypomina operator trójargumentowy z JavaScript:

TS
T extends U ? X : Y

Jeśli typ T można przypisać do U, to wynikiem będzie typ X, w przeciwnym razie Y.


Podstawowe typy warunkowe

Typ warunkowy ocenia warunek statycznie na poziomie typów:

TS
type IsNumber<T> = T extends number ? true : false;

type A = IsNumber<number>; // true
type B = IsNumber<string>; // false

Ten wzorzec jest niezwykle potężny w połączeniu z typami generycznymi do tworzenia elastycznych i dynamicznych typów pomocniczych.


Wyciąganie typów za pomocą infer

Wewnątrz klauzuli extends typu warunkowego możemy użyć słowa kluczowego infer do zadeklarowania zmiennej typu, która musi zostać wydedukowana przez kompilator.

Na przykład, jeśli chcemy wyciągnąć typ zwracany przez funkcję:

TS
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

type FunzioneEsempio = () => string;
type Ritorno = GetReturnType<FunzioneEsempio>; // string

W tym przykładzie infer R instruuje TypeScript, aby automatycznie pobrał typ zwracany przez funkcję i uczynił go dostępnym jako R w gałęzi twierdzącej warunku.


Spróbuj sam

Ćwiczenie 1: Typ IsString

Ćwiczenie#ts.m6.l1.e1
Próby: 0Ładowanie...

Utwórz typ generyczny o nazwie IsString<T>, który zwraca typ literalny true, jeśli T dziedziczy po string, w przeciwnym razie false.

Ładowanie edytora...
Pokaż wskazówkę

Użyj składni type IsString<T> = T extends string ? true : false; aby sprawdzić typ.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie 2: Wyciąganie typu z tablicy za pomocą infer

Ćwiczenie#ts.m6.l1.e2
Próby: 0Ładowanie...

Zdefiniuj typ generyczny UnpackArray<T>, który używa infer do wyciągnięcia typu elementów tablicy T. Jeśli T jest tablicą (np. U[]), zwraca U, w przeciwnym razie zwraca ten sam typ T.

Ładowanie edytora...
Pokaż wskazówkę

Użyj T extends (infer U)[] ? U : T aby zadeklarować i zwrócić wydedukowaną zmienną typu U.

Rozwiązanie dostępne po 3 próbach