0Pricing
TypeScript Academy · Lekcja

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 tag

Interfejs 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 | null

Unia 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" URI

Noś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 | null

Dlaczego 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.
  • URIS jest unią wszystkich znaczników uzyskaną przez keyof.
  • 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

  1. Problem HKT w TypeScript
  2. Definiowanie konstruktorów typów
  3. Lekki wzorzec HKT
  4. Generyczne funktory i mapery
← Powrót do TypeScript Academy