typescript / intermediate
Snippet
Vollständige Musterübereinstimmung mit Diskriminierten Unionen und Never
Diskriminierte Unionen verbinden eine literale Eigenschaft ('kind') mit der Typverfeinerung von TypeScript. Indem der default-Zweig eines switch-Blocks an eine Funktion übergeben wird, die nur den Typ 'never' akzeptiert, garantiert der Compiler zur Kompilierzeit, dass jedes Unionsmitglied behandelt wird. Das Hinzufügen einer neuen Form ohne Aktualisierung der Switch-Anweisung führt zu einem gezielten Kompilierfehler.
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
type Circle = { kind: "circle"; radius: number };type Square = { kind: "square"; sideLength: number };type Rectangle = { kind: "rectangle"; width: number; height: number };type Shape = Circle | Square | Rectangle;function assertUnreachable(x: never): never {throw new Error(`Unexpected object: ${JSON.stringify(x)}`);}function calculateArea(shape: Shape): number {switch (shape.kind) {case "circle":return Math.PI * shape.radius ** 2;case "square":return shape.sideLength ** 2;case "rectangle":return shape.width * shape.height;default:return assertUnreachable(shape);}}
Erklärung
1
type Shape = Circle | Square | Rectangle;
Definiert einen diskriminierten Union-Typ, bei dem jedes Mitglied ein gemeinsames 'kind'-Feld mit eindeutigen Literalwerten besitzt.
2
function assertUnreachable(x: never): never {
Hilfsfunktion, die den Typ 'never' erwartet und einen Zustand darstellt, der unmöglich sein sollte, wenn alle Union-Zweige vollständig geprüft wurden.
3
return assertUnreachable(shape);
Löst beim Kompilieren einen Typfehler aus, falls eine Variante der Shape-Union im switch-Block fehlt.