Praktyczne zastosowania infer: rozwijanie Promise
Rozwijaj typy Promise, Array i niestandardowych opakowań.
Praktyczne zastosowania infer: rozwijanie Promise to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Problem rozpakowywania
Podczas pracy z kodem asynchronicznym często otrzymujesz Promise i potrzebujesz zawartego w nim T. Słowo kluczowe infer sprawia, że to wyodrębnianie można wielokrotnie stosować.
type Awaited<T> = T extends Promise<infer U> ? U : T;
type A = Awaited<Promise<string>>; // string
type B = Awaited<number>; // numberWbudowany typ narzędziowy Awaited
TypeScript 4.5 wprowadził wbudowany typ Awaited, który rekurencyjnie obsługuje zagnieżdżone obietnice.
type A = Awaited<Promise<Promise<string>>>; // string
// Handles arbitrary nesting automaticallyRozpakowywanie z własnym limitem głębokości
Zanim Awaited stał się typem wbudowanym, programiści używali typów rekurencyjnych z infer do rozpakowywania obietnic.
type DeepAwaited<T> =
T extends Promise<infer U> ? DeepAwaited<U> : T;
type A = DeepAwaited<Promise<Promise<number>>>; // numberRozpakowywanie elementów tablic
Ten sam wzorzec infer wyodrębnia typ elementu z tablicy, co odpowiada wbudowanemu podejściu T[number].
type Element<T> = T extends (infer U)[] ? U : never;
type A = Element<string[]>; // string
type B = Element<number[]>; // numberRozpakowywanie typów Observable
W przypadku Observable biblioteki RxJS infer wyodrębnia typ emitowanej wartości.
type ObservableType<T> = T extends Observable<infer U> ? U : never;
type A = ObservableType<Observable<User>>; // UserRozpakowywanie typu zwracanego przez funkcję
Połącz ReturnType i Awaited, aby uzyskać rozwiązaną wartość funkcji asynchronicznej.
async function getUser(): Promise<User> { /* ... */ }
type UserResult = Awaited<ReturnType<typeof getUser>>; // UserRozpakowywanie zagnieżdżonych opakowań
Można łączyć infer, aby obsługiwać typy opakowane w wiele warstw, takie jak Promise.
type UnwrapPromiseArray<T> =
T extends Promise<infer U>
? U extends (infer V)[]
? V
: U
: T;
type A = UnwrapPromiseArray<Promise<User[]>>; // UserWarunkowe rozpakowywanie na podstawie struktury
Użyj infer, aby warunkowo rozpakowywać tylko określone typy, pozostawiając pozostałe bez zmian.
type MaybeUnwrap<T> =
T extends Promise<infer U> ? U : T extends (infer V)[] ? V : T;
type A = MaybeUnwrap<Promise<string>>; // string
type B = MaybeUnwrap<number[]>; // number
type C = MaybeUnwrap<boolean>; // booleanTypowany wrapper do pobierania danych z API
Generyczny wrapper do pobierania danych, który zwraca typ rozstrzygniętych danych, jest klasycznym zastosowaniem rozpakowywania opartego na infer.
async function fetchData<T>(url: string): Promise<T> {
const res = await fetch(url);
return res.json() as T;
}
type UserData = Awaited<ReturnType<typeof fetchData<User>>>; // UserBezpieczne rozpakowywanie z obsługą błędów
Wzorzec Result połączony z infer pozwala wyodrębnić typ powodzenia z unii rozróżnianej.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type ExtractOk<T> = T extends Ok<infer V> ? V : never;
type A = ExtractOk<Ok<number> | Err>; // numberPodsumowanie: rozpakowywanie z infer
Słowo kluczowe infer jest uniwersalnym narzędziem do wyodrębniania typów z opakowań — obietnic, tablic, Observable i typów Result. Wbudowany typ Awaited obsługuje rozpakowywanie asynchroniczne; dla innych struktur należy używać własnych typów.
Szybkie sprawdzenie
Jaki jest najlepszy sposób na uzyskanie typu rozstrzygniętej wartości funkcji asynchronicznej?
Czego się nauczyłeś
Rozpakowywanie oparte na infer to praktyczne narzędzie w asynchronicznym kodzie TypeScript. Używaj wbudowanego Awaited dla obietnic i twórz własne typy rozpakowujące dla tablic, Observable oraz wzorców Result.
Często zadawane pytania
Czy lekcja „Praktyczne zastosowania infer: rozwijanie Promise” jest bezpłatna?
Tak — pełny tekst „Praktyczne zastosowania infer: rozwijanie Promise” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Praktyczne zastosowania infer: rozwijanie Promise”?
Rozwijaj typy Promise, Array i niestandardowych opakowań. Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?
Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Praktyczne zastosowania infer: rozwijanie Promise”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?
Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Poznawanie infer w typach warunkowych
- Tworzenie ReturnType i Parameters od podstaw
- Wzorce głęboko zagnieżdżonego wnioskowania
- Praktyczne zastosowania infer: rozwijanie Promise