0Pricing
TypeScript Academy · Lekcja

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>;          // number

Wbudowany 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 automatically

Rozpakowywanie 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>>>; // number

Rozpakowywanie 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[]>; // number

Rozpakowywanie 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>>; // User

Rozpakowywanie 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>>; // User

Rozpakowywanie 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[]>>; // User

Warunkowe 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>;          // boolean

Typowany 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>>>; // User

Bezpieczne 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>; // number

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

  1. Poznawanie infer w typach warunkowych
  2. Tworzenie ReturnType i Parameters od podstaw
  3. Wzorce głęboko zagnieżdżonego wnioskowania
  4. Praktyczne zastosowania infer: rozwijanie Promise
← Powrót do TypeScript Academy