Wie emulieren Sie ADTs und Mustervergleich in TypeScript?

8

Unglücklicherweise hat TypeScript (bis jetzt) ​​(noch) keine algebraischen Datentypen (Union-Typen) und Mustervergleiche (um sie zu destrukturieren). Außerdem unterstützt es nicht einmal instanceof auf Schnittstellen. Welches Muster verwenden Sie, um diese Sprachmerkmale mit maximaler Typensicherheit und minimalem Standardcode zu emulieren?

    
thSoft 10.01.2014, 00:24
quelle

4 Antworten

3

TypeScript 1.4 fügt Union Typen und Typ Wachen .

    
thSoft 12.11.2015, 17:34
quelle
6

Ich ging mit dem folgenden Besucher-ähnlichen Muster, inspiriert von diesem und dies (im Beispiel kann ein Choice Foo oder Bar sein):

%Vor%

Verwendung:

%Vor%

Das Matching selbst ist ausdrucksstark und typsicher, aber es gibt eine Menge zu schreiben für die Typen.

    
thSoft 12.01.2014 19:38
quelle
2

Um zu antworten

  

es unterstützt nicht einmal instanceof auf Schnittstellen.

Grund ist Typ löschen. Schnittstellen sind nur ein Compile-Typ-Konstrukt und haben keine Auswirkungen auf die Laufzeit. Sie können jedoch instanceof für Klassen verwenden, z. :

%Vor%     
basarat 10.01.2014 14:16
quelle
1

Hier ist eine Alternative zu der sehr guten Antwort von @thSoft. Auf der positiven Seite, diese Alternative

  1. hat potentielle Interoperabilität mit rohen Javascript-Objekten in der Form { type : string } & T , wobei die Form von T vom Wert von type ,
  2. abhängt
  3. hat wesentlich weniger Wahlmöglichkeiten;

auf der negativen Seite

  1. erzwingt nicht statisch, dass Sie alle Fälle abgleichen,
  2. unterscheidet nicht zwischen verschiedenen ADTs.

Es sieht so aus:

%Vor%     
Søren Debois 14.01.2016 17:12
quelle