TypeScript Academy · Lektion

Felmeddelanden i DSL:er på typnivå

Visa användbara kompileringsfel för DSL-användare.

Lektion 4 av 413 steg

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 cause

Fel 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.

Gratis att börja

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

  1. Vad är en DSL på typnivå
  2. Utforma en fluent query-DSL
  3. Validering av indata vid kompilering
  4. Felmeddelanden i DSL:er på typnivå
← Tillbaka till TypeScript Academy