Felmeddelanden i DSL:er på typnivå
Visa användbara kompileringsfel för DSL-användare.
Felmeddelanden i DSL:er på typnivå är en gratis lektion i TypeScript Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för TypeScript Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i TypeScript Academy innehåller totalt 4 lektioner.
Hjälpsamma felmeddelanden i DSL:er på typnivå
Den svåraste delen av en DSL på typnivå är att göra fel begripliga. Råa never- eller "not assignable"-fel förvirrar användarna. Vi visar beskrivande fel med hjälp av brandade feltyper och utformade never-meddelanden.
Problemet med never
När valideringen misslyckas genom att bli never säger kompilatorn "Argument of type X is not assignable to never", vilket inte berättar varför. Det kan göras bättre.
Brandade feltyper
I stället för vanlig never returnerar Ni en unikt utformad feltyp som innehåller en begriplig meddelandesträng i sin typ.
type TypeError<Msg extends string> = {
readonly __error: Msg;
};
type E = TypeError<"Column 'foo' does not exist">;Returnera fel från valideringen
En validator returnerar antingen den giltiga värdetypen eller ett brandat fel som beskriver problemet. Kontrollen "har en punkt" är ett template literal-mönster (backticks i den riktiga koden); här betecknar vi det som HasDot.
// HasDot<S> is the backtick pattern: any text, ".", any text.
type Validate<S extends string> =
S extends HasDot
? S
: TypeError<"Path must contain a dot, e.g. user.name">;Tvinga fram felet
Begränsa parametern så att allt som inte kan tilldelas till felbranden visar meddelandet. Feltypen visas direkt i kompilatorns utskrift.
declare function path<S extends string>(
p: Validate<S> extends TypeError<infer M> ? TypeError<M> : S
): void;
path("oops");
// Error message includes: __error: "Path must contain a dot..."Särskilj flera fel
Olika fel returnerar olika meddelanden, så användarna får specifik vägledning i stället för ett generiskt avvisande. HasDot är återigen template literal-mönstret med backticks för "innehåller en punkt".
type Check<S extends string> =
S extends "" ? TypeError<"Path cannot be empty">
: S extends HasDot ? S
: TypeError<"Missing dot separator">;never med en twist
En annan teknik kombinerar en värdeposition med ett bokstavligt meddelande, så att det visas när Ni håller pekaren över värdet. Kombinera den felande typen med ett märkt objekt.
type Invalid<M extends string> = { error: M } & never;
// using never keeps it unassignable while the label hints the causeFel i fluenta DSL:er
I en kedjad DSL låter Ni nästa ogiltiga steg returnera en brandad feltyp i stället för ett giltigt steg, så att editorn visar meddelandet direkt där misstaget görs.
interface Stage {
// calling done() before where() yields a labeled error
done(): TypeError<"Call .where() before .done()">;
}Håll meddelanden korta
Långa meddelandetyper gör kompilatorns utskrift omfattande och verktygen långsammare. Välj korta, handlingsinriktade formuleringar. Ta med den felande token om det är enkelt, men undvik stora interpoleringar.
Testa felen
Skriv tester på typnivå som bekräftar att felbranden visas för kända felaktiga indata, så att refaktoreringar inte i tysthet försämrar utvecklarupplevelsen.
type Expect<T extends true> = T;
type _t = Expect<Validate<"oops"> extends TypeError<any> ? true : false>;Varför detta är viktigt
En DSL är bara så bra som sina felmeddelanden. Brandade feltyper omvandlar kryptiska never-fel till självförklarande meddelanden och förbättrar upplevelsen av att använda ert API på typnivå avsevärt.
Snabb kontroll
Bekräfta att Ni har förstått felmeddelanden på typnivå.
Sammanfattning
För att göra DSL:er på typnivå användbara ersätter Ni vanlig never med brandade feltyper som innehåller läsbara meddelanden. Validatorer returnerar antingen den giltiga typen eller en specifik felbrand, och genom att begränsa parametrar visas meddelandet i kompilatorns utskrift. Håll meddelandena korta och testa dem.
Lär dig TypeScript med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 101
- Lektioner
- 352
Vanliga frågor
Är lektionen ”Felmeddelanden i DSL:er på typnivå” gratis?
Ja – hela texten till ”Felmeddelanden i DSL:er på typnivå” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i TypeScript Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i TypeScript Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Felmeddelanden i DSL:er på typnivå”?
Visa användbara kompileringsfel för DSL-användare. Ni övar på TypeScript Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig TypeScript Academy?
Du behöver inga förkunskaper. Utbildningen i TypeScript Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Felmeddelanden i DSL:er på typnivå”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här TypeScript Academy-lektionen?
Ja. Varje TypeScript Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Vad är en DSL på typnivå
- Utforma en fluent query-DSL
- Validering av indata vid kompilering
- Felmeddelanden i DSL:er på typnivå