Definiowanie konstruktorów typów
Koduj konstruktory typów jako wyszukiwanie w interfejsach
Definiowanie konstruktorów typów to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 2 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.
Nazywanie konstruktorów typów
Kodowanie zaczyna się od nadania każdemu konstruktorowi typu unikatowego identyfikatora tekstowego nazywanego URI. URI jest znacznikiem zastępującym konstruktor wszędzie tam, gdzie nie można przekazać samego konstruktora.
type ArrayURI = "Array";
type OptionURI = "Option";
// Each container gets a unique string tagInterfejs rejestru
Przechowujemy jeden interfejs, który mapuje każdy URI na konkretny typ tworzony dla danego argumentu A. Ten interfejs jest rejestrem. Każdy klucz jest URI, a każda wartość jest rozstrzygniętym typem.
interface URItoKind<A> {
Array: Array<A>;
Option: A | null;
}
// URItoKind<number>["Array"] is number[]Wyszukiwanie konstruktora
Ponieważ rejestr jest indeksowany za pomocą URI, zastosowanie konstruktora staje się dostępem indeksowanym. Aby uzyskać „Array zastosowane do number”, należy odwołać się do rejestru za pomocą indeksu.
type ArrayOfNumber = URItoKind<number>["Array"]; // number[]
type OptionOfString = URItoKind<string>["Option"]; // string | nullUnia URIS
Zbiór prawidłowych znaczników konstruktorów to po prostu klucze rejestru. keyof URItoKind<unknown> daje unię wszystkich zarejestrowanych URI, którą nazywamy URIS.
type URIS = keyof URItoKind<unknown>; // "Array" | "Option"Scalanie deklaracji rozszerza rejestr
TypeScript oferuje potężną funkcję: interfejsy o tej samej nazwie są scalane. Biblioteki korzystają z tego, aby każdy moduł mógł dodać własny kontener do URItoKind bez edytowania pierwotnej definicji.
interface URItoKind<A> {
Tree: { value: A; children: Array<A> };
}
// Now URIS also includes "Tree"Modułowe kontenery
Dzięki scalaniu kontener zdefiniowany w jednym pliku rejestruje się globalnie. Każdy, kto go zaimportuje, może używać jego URI w generycznych abstrakcjach. Dokładnie tak fp-ts dodaje Option, Either, Task i inne typy.
// file a.ts
interface URItoKind<A> { Either: { left: A } | { right: A } }
// file b.ts can now reference the "Either" URINośnik fantomowy
Aby przekazywać informację o konstruktorze jako typ powiązany z wartością, instancje przechowują swoje URI we właściwości, często w polu fantomowym. Pole to nigdy nie zawiera rzeczywistej wartości; rejestruje jedynie znacznik na potrzeby systemu typów.
interface HasURI<F extends URIS> {
readonly _URI: F;
}
// _URI records which constructor an instance is forŁączenie URI z argumentem
Zastosowanie konstruktora wymaga dwóch elementów: URI F oraz typu argumentu A. Połączymy je za pomocą wyszukiwania, tak aby para (F, A) wskazywała konkretny typ przez rejestr.
type Apply<F extends URIS, A> = URItoKind<A>[F];
type A = Apply<"Array", number>; // number[]
type B = Apply<"Option", string>; // string | nullDlaczego ciągi, a nie konstruktory
Używamy ciągów, ponieważ TypeScript może przechowywać je i porównywać jako typy literalne oraz indeksować nimi rejestr. Nie możemy przechowywać konstruktora Array jako parametru typu, ale możemy przechowywać literał "Array" i wyszukiwać go w rejestrze.
type Tag = "Array";
type Resolved = URItoKind<boolean>[Tag]; // boolean[]Wyszukiwanie jest kluczowym krokiem
Ten dostęp indeksowany, URItoKind<A>[F], stanowi sedno kodowania. Zmienia niemożliwe zastosowanie typu F<A> w prawidłowe wyszukiwanie w rejestrze. W następnej lekcji zostanie ono sformalizowane jako Kind<F, A>.
type Kind<F extends URIS, A> = URItoKind<A>[F];
type X = Kind<"Array", number>; // number[]Podsumowanie konfiguracji
Mają już Państwo wszystkie elementy: URI jako znaczniki, rejestr URItoKind mapujący znacznik oraz argument na konkretny typ, URIS jako unię znaczników oraz scalanie deklaracji do jego rozszerzania. Indeksowanie rejestru symuluje zastosowanie typu.
// URItoKind = registry, URIS = valid tags,
// URItoKind<A>[F] = "apply constructor F to A"Szybki test
Proszę sprawdzić zrozumienie kodowania z użyciem rejestru.
Podsumowanie
Nauczyli się Państwo kodować konstruktory typów za pomocą ciągów.
- Każdy konstruktor otrzymuje unikatowy znacznik URI.
URItoKind<A>mapuje znaczniki na konkretne typy.URISjest unią wszystkich znaczników uzyskaną przezkeyof.- Scalanie deklaracji pozwala modułom rejestrować nowe kontenery.
Następnie: opakowanie wyszukiwania we wzorzec Kind.
Często zadawane pytania
Czy lekcja „Definiowanie konstruktorów typów” jest bezpłatna?
Tak — pełny tekst „Definiowanie konstruktorów typów” 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 „Definiowanie konstruktorów typów”?
Koduj konstruktory typów jako wyszukiwanie w interfejsach Ć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 2 z 4.
Ile czasu zajmuje lekcja „Definiowanie konstruktorów typów”?
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
- Problem HKT w TypeScript
- Definiowanie konstruktorów typów
- Lekki wzorzec HKT
- Generyczne funktory i mapery