0Pricing
TypeScript Academy · Lekcja

Wzorce głęboko zagnieżdżonego wnioskowania

Stosuj infer rekurencyjnie do złożonego wyodrębniania typów.

Wzorce głęboko zagnieżdżonego wnioskowania to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 3 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.

Dlaczego głębokie wnioskowanie?

Czasami potrzebny typ jest ukryty wewnątrz kilku warstw generyków. Głębokie wnioskowanie wykorzystuje rekurencyjne lub łańcuchowe typy warunkowe, aby do niego dotrzeć.

type DeepUnwrap<T> =
  T extends Promise<infer U>
    ? DeepUnwrap<U>
    : T;

type A = DeepUnwrap<Promise<Promise<string>>>; // string

Rekurencyjne typy warunkowe

TypeScript 4.1+ obsługuje rekurencyjne typy warunkowe, dzięki czemu można zdejmować kolejne warstwy opakowań jedna po drugiej.

type Flatten<T> = T extends Array<infer U> ? Flatten<U> : T;
type B = Flatten<string[][][]>; // string

Wnioskowanie z zagnieżdżonych generyków

Można połączyć wiele zmiennych infer w jednej klauzuli extends, aby jednocześnie przechwycić kilka warstw.

type InnerValue<T> =
  T extends Map<any, infer V>
    ? V extends Set<infer S>
      ? S
      : V
    : T;
type C = InnerValue<Map<string, Set<number>>>; // number

Typy głęboko zagnieżdżonych właściwości obiektu

Typy rekurencyjne mogą przechodzić po strukturach obiektów, aby wyodrębniać typy głęboko zagnieżdżonych właściwości.

type DeepGet<T, K extends keyof T> =
  T[K] extends object ? T[K] : never;

type Nested = { user: { profile: { name: string } } };
type Profile = DeepGet<Nested, "user">; // { profile: { name: string } }

Głębokie wyodrębnianie typów elementów tablic

Połączenie rekurencyjnego rozpakowywania z obsługą tablic obejmuje dowolną głębokość zagnieżdżenia.

type ElementType<T> = T extends (infer U)[] ? ElementType<U> : T;
type D = ElementType<number[][][]>; // number

Rekurencja ogonowa krotek

Manipulowanie krotkami za pomocą rekurencji ogonowej to popularny wzorzec w bezpiecznych typowo potokach i typach kompozycji funkcji.

type Last<T extends any[]> =
  T extends [...infer _, infer L] ? L : never;
type E = Last<[1, 2, 3]>; // 3

Limity głębokości i praktyczne uwagi

TypeScript ogranicza głębokość rekurencji, aby zapobiegać nieskończonym pętlom. Rekurencja powinna być płytka, a w razie potrzeby warto ograniczyć ją za pomocą licznika głębokości.

// Deep recursion may hit "Type instantiation is excessively deep"
// Simplify or use branded types to break deep chains

Infer podczas rozdzielania unii

Gdy T jest unią, typy warunkowe są rozdzielane: każdy składnik jest dopasowywany osobno, a wyniki są łączone w unię.

type Unwrap<T> = T extends Promise<infer U> ? U : T;
type F = Unwrap<Promise<string> | Promise<number> | boolean>;
// string | number | boolean

Wnioskowanie z krotek resztowych

Wzorce krotek resztowych z infer umożliwiają rozkład na początek i koniec oraz manipulowanie typami o zmiennej liczbie elementów.

type Init<T extends any[]> =
  T extends [...infer I, any] ? I : never;
type G = Init<[1, 2, 3, 4]>; // [1, 2, 3]

Przykład z praktyki: zagnieżdżona odpowiedź API

Zagnieżdżony typ odpowiedzi API można rozpakować do typu danych za pomocą łańcucha infer.

type ApiResponse<T> = { data: T; status: number };
type UnwrapApi<T> = T extends ApiResponse<infer D> ? D : T;
type H = UnwrapApi<ApiResponse<{ users: string[] }>>; // { users: string[] }

Podsumowanie: głębokie wnioskowanie

Głębokie wnioskowanie łączy rekurencyjne typy warunkowe, wiele zmiennych infer i dopasowywanie wzorców strukturalnych, aby wyodrębniać typy z generycznych struktur zagnieżdżonych na dowolnej głębokości.

Szybkie sprawdzenie

Co zwraca Flatten, jeśli Flatten = T extends Array ? Flatten : T?

Czego się nauczyłeś

Głębokie wnioskowanie wykorzystuje rekurencyjne typy warunkowe i łańcuchowe wzorce infer, aby docierać do typów ukrytych wewnątrz wielu generycznych opakowań. Należy ograniczać rekurencję, aby uniknąć limitów głębokości TypeScript.

Często zadawane pytania

Czy lekcja „Wzorce głęboko zagnieżdżonego wnioskowania” jest bezpłatna?

Tak — pełny tekst „Wzorce głęboko zagnieżdżonego wnioskowania” 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 „Wzorce głęboko zagnieżdżonego wnioskowania”?

Stosuj infer rekurencyjnie do złożonego wyodrębniania typów. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Wzorce głęboko zagnieżdżonego wnioskowania”?

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