Walidacja danych wejściowych w czasie kompilacji
Odrzucaj niepoprawne wyrażenia DSL przed uruchomieniem programu
Walidacja danych wejściowych w czasie kompilacji 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.
Walidacja danych wejściowych w czasie kompilacji
DSL-e na poziomie typów mogą odrzucać niepoprawne wyrażenia przed uruchomieniem programu. Za pomocą typów literałów szablonowych i typów warunkowych można sprawdzać strukturę ciągu znaków na poziomie typów i odrzucać niepoprawne dane wejściowe.
Przykład: mały język selektorów
Załóżmy, że akceptowane są ciągi znaków takie jak "user.name" lub "order.items.length". Celem jest odrzucenie "user." lub ".name" już podczas kompilacji.
Parsowanie za pomocą literałów szablonowych
Typy literałów szablonowych dzielą ciąg znaków na części za pomocą infer, co stanowi podstawę parsowania podczas kompilacji. Rzeczywisty wzorzec jest ograniczony backtickami (Head, kropka, Tail z infer); ten dzielący wzorzec oznaczamy jako DotSplit.
// Real TS: backtick pattern matching Head, ".", Tail.
type Split<S extends string> =
S extends DotSplit<infer Head, infer Tail>
? [Head, ...Split<Tail>]
: [S];
type P = Split<"a.b.c">; // ["a", "b", "c"]Walidowanie każdego segmentu
Typ warunkowy sprawdza, czy żaden segment nie jest pusty. Pusty segment oznacza niepoprawne dane wejściowe. Ten sam wzorzec DotSplit (w rzeczywistym kodzie literał szablonowy ograniczony backtickami) steruje rekurencją.
type NonEmpty<S extends string> = S extends "" ? false : true;
type Valid<S extends string> =
S extends DotSplit<infer H, infer T>
? H extends "" ? false : Valid<T>
: NonEmpty<S>;
type V1 = Valid<"a.b">; // true
type V2 = Valid<"a.">; // falseUzależnianie API od poprawności
Można użyć typu poprawności do ograniczenia parametru funkcji: poprawne ciągi zachowują swój typ, a niepoprawne są rozwiązywane do never, dlatego wywołanie nie przechodzi kompilacji.
declare function path<S extends string>(
p: Valid<S> extends true ? S : never
): void;
path("user.name"); // ok
path("user."); // Error: argument is neverOdrzucanie nieznanych tokenów
Można również ograniczyć dozwolone znaki. Należy dopasowywać wyłącznie znane wzorce segmentów; wszystko inne zostanie zredukowane do typu odrzucającego.
type Allowed = "user" | "order" | "name" | "items";
type CheckSeg<S extends string> = S extends Allowed ? true : false;Weryfikowanie operatorów
W przypadku DSL wyrażeń, takiego jak "age > 18", można dopasować operator za pomocą literału szablonowego i sprawdzić, czy należy do dozwolonego zbioru. Matcher (lewa spacja O spacja prawa) jest w rzeczywistym kodzie literałem szablonowym zapisanym z użyciem odwrotnych apostrofów; tutaj oznaczamy go jako CondMatch.
type Op = ">" | "<" | "=" | ">=" | "<=";
// Real TS: backtick pattern -> left, " ", infer O, " ", right.
type IsCond<S extends string> =
S extends CondMatch<infer O>
? O extends Op ? true : false
: false;
type C1 = IsCond<"age > 18">; // true
type C2 = IsCond<"age ! 18">; // falseŁączenie kontroli
Rzeczywiste walidatory sprawdzają jednocześnie kilka warunków: niepuste segmenty, dozwolone tokeny i zrównoważoną strukturę. Każdy z nich jest typem warunkowym; można je łączyć za pomocą typów pomocniczych działających podobnie do operatorów logicznych.
type And<A, B> = A extends true ? (B extends true ? true : false) : false;Limity rekurencji
Rekurencja na poziomie typów ma ograniczoną głębokość. W przypadku bardzo długich ciągów kompilator może zgłosić błąd „type instantiation is excessively deep”. Należy ograniczyć długość analizowanych danych albo uprościć gramatykę.
Lepsze rozwiązanie niż analiza w czasie wykonywania
Parser działający w czasie wykonywania zgłasza problem dopiero wtedy, gdy niepoprawny ciąg zostanie przeanalizowany. Walidacja w czasie kompilacji odrzuca literał natychmiast po jego wpisaniu, zapewnia pełne informacje zwrotne w edytorze i nie generuje żadnego kosztu w czasie wykonywania.
Dlaczego ma to znaczenie
Wiele DSL-i przyjmuje dane wejściowe w postaci ciągów znaków (ścieżki, zapytania, formaty). Weryfikowanie ich struktury w systemie typów pozwala wykrywać literówki i niepoprawne wyrażenia przed uruchomieniem programu, zamieniając klasę błędów czasu wykonywania na błędy kompilacji.
Szybkie sprawdzenie
Sprawdź, czy rozumiesz walidację danych wejściowych w czasie kompilacji.
Podsumowanie
Zweryfikowano dane wejściowe DSL przed uruchomieniem, analizując literały ciągów za pomocą typów literałów szablonowych i infer, a następnie sprawdzając segmenty i operatory przy użyciu typów warunkowych. Uzależnienie parametru funkcji od typu poprawności sprawia, że niepoprawne wyrażenia są rozwiązywane do never i nie przechodzą kompilacji. Należy przy tym pamiętać o limitach rekurencji.
Często zadawane pytania
Czy lekcja „Walidacja danych wejściowych w czasie kompilacji” jest bezpłatna?
Tak — pełny tekst „Walidacja danych wejściowych w czasie kompilacji” 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 „Walidacja danych wejściowych w czasie kompilacji”?
Odrzucaj niepoprawne wyrażenia DSL przed uruchomieniem programu Ć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 „Walidacja danych wejściowych w czasie kompilacji”?
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