Czym jest DSL na poziomie typów
Używaj typów do ograniczania fluent API do poprawnych programów
Czym jest DSL na poziomie typów to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 1 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.
Czym jest DSL na poziomie typów
DSL na poziomie typów, czyli DSL (język dziedzinowy), wykorzystuje typy TypeScript do ograniczania API, tak aby kompilowały się wyłącznie poprawne programy. Typy pełnią funkcję gramatyki: niepoprawne połączenia są odrzucane, zanim kod zostanie uruchomiony.
Wbudowane DSL
Wbudowany DSL działa wewnątrz języka gospodarza (w tym przypadku TypeScript), a nie jako osobny parser. Pisany jest zwykły kod TS, ale system typów wymusza reguły DSL.
Znany przykład
DSL-i na poziomie typów były już używane: builder zapytań, który dopuszcza wyłącznie poprawne nazwy kolumn, albo router wnioskujący parametry ze ścieżki. Typy kodują operacje dozwolone przez API.
Ograniczanie fluent API
Najważniejsza idea jest następująca: każda metoda zwraca typ ograniczający metody, które można wywołać następnie. Wywołanie elementów w niewłaściwej kolejności uniemożliwia kompilację.
interface Empty { from(t: string): HasFrom; }
interface HasFrom { where(c: string): HasFrom; select(): string; }
declare const q: Empty;
q.from("users").select(); // ok
q.select(); // Error: select not on EmptyMaszyny stanów w typach
Ten wzorzec jest maszyną stanów na poziomie typów: każdy interfejs reprezentuje stan, a każda metoda — przejście do innego stanu. Kompilator przechodzi przez tę maszynę podczas łączenia wywołań.
Dlaczego nie wystarczą sprawdzenia w czasie działania
Sprawdzenia w czasie działania zawodzą późno, na produkcji i w obecności użytkowników. DSL na poziomie typów zawodzi wcześnie, w edytorze, sygnalizując problem czerwoną falistą linią, zanim kod zostanie wdrożony. Te same reguły zapewniają znacznie tańszą informację zwrotną.
Parametry typów fantomowych
DSL-e często przechowują informacje w fantomowych parametrach typów: generykach istniejących wyłącznie w czasie kompilacji, które śledzą zgromadzony stan (wybrane kolumny, powiązane zmienne) bez kosztu w czasie działania.
interface Query<Selected extends string> {
select<C extends string>(c: C): Query<Selected | C>;
}Typy literałów jako tokeny
Tekstowe typy literałów pełnią funkcję tokenów DSL. W połączeniu z literałami szablonowymi i uniami pozwalają systemowi typów analizować tekstową zawartość DSL.
type Direction = "asc" | "desc";
declare function orderBy(col: string, dir: Direction): void;
orderBy("age", "asc"); // ok
orderBy("age", "up"); // Error: not a DirectionElementy składowe
DSL-e na poziomie typów łączą: generyki do reprezentowania stanu, typy warunkowe do rozgałęzień, literały szablonowe do parsowania ciągów znaków oraz typy mapowane do przekształcania struktur. W kolejnych lekcjach wykorzystane zostaną wszystkie te elementy.
Kompromisy
DSL-e na poziomie typów zapewniają silne gwarancje, ale nadużywane mogą generować nieczytelne błędy i spowalniać kompilację. Dobre DSL-e równoważą bezpieczeństwo z czytelnymi komunikatami błędów (temu poświęcona jest jedna z późniejszych lekcji).
Dlaczego to ma znaczenie
Zakodowanie reguł dziedzinowych w typach sprawia, że kompilator staje się ekspertem w danej dziedzinie i automatycznie odrzuca nonsensowne konstrukcje. Właśnie dlatego buildery zapytań, biblioteki formularzy i systemy efektów oferują tak silne gwarancje.
Szybki test
Proszę sprawdzić, czy rozumieją Państwo DSL-e na poziomie typów.
Podsumowanie
DSL na poziomie typów wykorzystuje typy TypeScript jako gramatykę, dzięki czemu kompilują się wyłącznie poprawne programy. Fluent API modelują maszyny stanów, w których każda metoda zwraca typ ograniczający stan, a generyki fantomowe, tokeny oparte na typach literałów, typy warunkowe, literały szablonowe i typy mapowane pełnią funkcję elementów składowych. Zapewnia to wczesną informację zwrotną już w edytorze.
Często zadawane pytania
Czy lekcja „Czym jest DSL na poziomie typów” jest bezpłatna?
Tak — pełny tekst „Czym jest DSL na poziomie 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 „Czym jest DSL na poziomie typów”?
Używaj typów do ograniczania fluent API do poprawnych programó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 1 z 4.
Ile czasu zajmuje lekcja „Czym jest DSL na poziomie 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
- Czym jest DSL na poziomie typów
- Projektowanie fluent query DSL
- Walidacja danych wejściowych w czasie kompilacji
- Komunikaty błędów w DSL na poziomie typów