TypeScriptGeneryki i typy zaawansowane
infer
Wyciąga typ z wnętrza innego typu w typie warunkowym.
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 : InnyWięcej przykładów
#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
inferopisowo, gdy typ jest złożony, np.infer TItem.
Powiązane hasła
#Widzisz błąd albo brakuje przykładu? Napisz do nas.