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>>>; // stringRekurencyjne 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[][][]>; // stringWnioskowanie 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>>>; // numberTypy 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[][][]>; // numberRekurencja 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]>; // 3Limity 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 chainsInfer 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 | booleanWnioskowanie 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?
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
- Poznawanie infer w typach warunkowych
- Tworzenie ReturnType i Parameters od podstaw
- Wzorce głęboko zagnieżdżonego wnioskowania
- Praktyczne zastosowania infer: rozwijanie Promise