0

Ich bin derzeit in den Prozess der Google Closure Compiler zu vergleichen und die Flow statischen Typ checker, in Bezug auf die Ausdruckskraft. Was ich an letzterem mag, ist, dass es anscheinend sehr schön ist. Das Handbuch gibt dieses Beispiel:Stichwort Gewerkschaften in Schließung Compiler

type Result = Done | Error; // a disjoint union type with two cases 
type Done = { status: 'done', answer: Matrix }; 
type Error = { status: 'error', message: string }; 

Gibt es eine Möglichkeit, so etwas mit Closure Compiler zu tun? Das bedeutet, dass bestimmte Eigenschaften eines Objekts nicht nur von einem bestimmten Typ sein müssen, sondern einen festen Wert haben? Und um diesen Wert für die Typinferenz zu verwenden, um zwischen verschiedenen Optionen in einer Union zu unterscheiden? Ich fand keine Dokumentation zu diesem Zweck.

Antwort

1

Es ist keine exakte Übersetzung. Hier ist, wie ich das schreiben würde:

Dies ist eine sehr ausführliche Syntax, bietet aber die beste Typüberprüfung. Es wird angenommen, dass jedes Objekt mit diesen Eigenschaften dem Typ entspricht. Zusätzliche Eigenschaften sind erlaubt.

Es gibt eine viel kürzere Syntax mit leicht unterschiedlichem Verhalten: typedefs.

/** @enum {string} */ 
var ResultStatus = { 
    DONE: 'done', 
    ERROR: 'error' 
}; 

/** 
* @typedef{{ 
* status: ResultStatus 
* answer: Matrix 
* }} 
*/ 
var Done; 

/** 
* @typedef{{ 
* status: ResultStatus 
* message: string 
* }} 
*/ 
var Error; 

/** @type {Result|Error} */ 
var Result; 

Es gibt mehrere andere Möglichkeiten, um diese Typen als auch zu schreiben. Welche Sie auswählen, hängt davon ab, was Sie überprüfen möchten. Möchten Sie beispielsweise eine Warnung erhalten, wenn Sie eine Eigenschaft falsch schreiben (oder versuchen, eine Eigenschaft hinzuzufügen)? Möchten Sie eine genaue Übereinstimmung für beide Eigenschaftsnamen oder -typen oder sind zusätzliche Eigenschaften zulässig?

+0

Wusste nicht, dass man eine 'enum' als Typ verwenden könnte. Wenn ich Sie richtig erkläre, sagen beide Formen, die Sie vorschlagen, dass die 'Status'-Eigenschaft einer der beiden Werte sein kann, ohne die Verbindung zwischen Wert und dem entsprechenden Typ zu fixieren. Vielleicht würde ein einzelnes Element 'enum' pro Typ diesem Zweck dienen ... Muss etwas damit experimentieren. – MvG

+0

Enum mit einem einzelnen Wert könnte funktionieren –