infer

Wyciąga typ z wnętrza innego typu w typie warunkowym.

Na tej stronie

Przykład

#
TypeScript
type ElementOf<T> = T extends (infer U)[] ? U : never
type Unwrap<T> = T extends Promise<infer U> ? U : T

type Tag = ElementOf<string[]>
// type Tag = string
type Data = Unwrap<Promise<{ level: number }>>
// type Data = { level: number }
type Plain = Unwrap<number>
// type Plain = number

const data: Data = { level: 7 }
console.log(data.level)
Wynik
7

Definicja i zastosowanie

#

Słowo infer wolno użyć tylko w warunku typu warunkowego. Deklaruje ono nowy, lokalny parametr typu, który TypeScript sam dopasuje. Na przykład T extends Promise<infer U> ? U : T wyciąga typ wartości z obietnicy.

W ten sposób działają wbudowane typy narzędziowe ReturnType, Parameters i Awaited. Możesz tworzyć własne: typ elementu tablicy, typ argumentu funkcji zwrotnej, typ pola zagnieżdżonego obiektu.

Jeśli dopasowanie się nie uda, typ warunkowy przechodzi do gałęzi „nie”, więc zawsze warto przemyśleć, co ma zwracać w takim przypadku.

Składnia

#
Składnia
type Wynik<T> = T extends Wzorzec<infer U> ? U : Inny

Więcej przykładów

#
Typ pierwszego argumentu funkcji
TypeScript
type FirstArg<F> = F extends (first: infer A, ...rest: any[]) => any ? A : never

function greet(name: string, times: number) {
  return `Cześć ${name}! `.repeat(times).trim()
}

type Name = FirstArg<typeof greet>
// type Name = string

const who: Name = 'Ola'
console.log(greet(who, 2))
Wynik
Cześć Ola! Cześć Ola!

Dobre praktyki

#
  • Zanim napiszesz własny typ z infer, sprawdź wbudowane: ReturnType, Parameters, Awaited, InstanceType.
  • Nazywaj parametry z infer opisowo, gdy typ jest złożony, np. infer TItem.

Powiązane hasła

#

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