typescript / expert
Snippet
Strukturierte Fehler-Ursachen-Kette mit erschöpfender Verengung
Dieses Beispiel veranschaulicht die Erstellung domänenspezifischer Fehlerklassen mit generischen Code-Diskriminanten in Kombination mit nativen `Error.cause`-Optionen. Es nutzt den `never`-Typ von TypeScript, um eine erschöpfende Prüfung aller Fehlerpfade zur Kompilierzeit zu erzwingen.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class ApplicationError<TCode extends string = string> extends Error {constructor(public readonly code: TCode,message: string,options?: { cause?: unknown }) {super(message, options);this.name = 'ApplicationError';}}type DatabaseError = ApplicationError<'ERR_DB_OFFLINE' | 'ERR_DB_QUERY'>;type NetworkError = ApplicationError<'ERR_NET_TIMEOUT'>;type DomainError = DatabaseError | NetworkError;function handleDomainError(err: DomainError): string {switch (err.code) {case 'ERR_DB_OFFLINE':return 'Database connection lost';case 'ERR_DB_QUERY':return 'Failed to execute query';case 'ERR_NET_TIMEOUT':return 'Network timed out';default: {const _exhaustiveCheck: never = err;throw new Error(`Unhandled error code: ${(_exhaustiveCheck as ApplicationError).code}`);}}}
Erklärung
1
class ApplicationError<TCode extends string = string> extends Error
Erweitert den Standard-Fehler um eine generische String-Literal-Eigenschaft zur diskriminierenden Verengung.
2
super(message, options);
Übergibt Optionen mit verschachtelten Fehlerursachen an den übergeordneten Error-Konstruktor.
3
type DomainError = DatabaseError | NetworkError;
Kombiniert spezifische typisierte Fehler-Unions für bestimmte Domänengrenzen.
4
const _exhaustiveCheck: never = err;
Löst einen TypeScript-Kompilierfehler aus, wenn ein neuer Fehlercode hinzugefügt und nicht behandelt wird.