0

私は現在、表現力の点で、Google Closure CompilerFlowの静的型チェッカーを比較しています。後者について私が気に入っているのは、それが明らかにrepresent tagged unionsできれいにできるということです。このマニュアルでは、この例を示します。閉包コンパイラのタグ付きユニオン

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

Closure Compilerを使用してこのようなことを行う方法はありますか?それは、特定のタイプのものだけでなく、固定値を持つようにオブジェクトのある種の特質を強制する何らかの方法を意味しますか?そして、型推論にその値を使うためには、組合のさまざまなオプションを区別することができますか?私はこの効果についての文書は見つけられませんでした。

答えて

1

正確な翻訳はありません。これを書く方法は次のとおりです。

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

/** @record */ 
var Done = function() {}; 

/** @type {ResultStatus} */ 
Done.prototype.status; 

/** @type {Matrix} */ 
Done.prototype.answer; 

/** @record */ 
var Error = function() {}; 

/** @type {ResultStatus} */ 
Error.prototype.status; 

/** @type {string} */ 
Error.prototype.message; 

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

これは非常に冗長な構文ですが、最適なタイプチェックを提供します。これらのプロパティを持つオブジェクトは、その型と一致するものとみなされます。余分なプロパティは許可されます。

構文がはるかに短く、動作が少し異なります: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; 

これらのタイプを書き込むには、他にもいくつかの方法があります。あなたが選ぶものは、あなたがチェックしたいものによって決まります。たとえば、プロパティのスペルを間違えた場合(または追加しようとした場合)警告が表示されますか?プロパティ名または型の両方で正確に一致したいのですか、または余分なプロパティが許可されていますか?

+0

型として 'enum'を使うことができるかどうかわかりませんでした。私があなたに正しく当てはまるとすれば、両方のフォームは値と対応する型の間のリンクを固定せずに、 'status'プロパティが2つの値のどちらかであると言います。おそらく、タイプごとに1つの要素のenumがその目的に役立つでしょう...それを少し実験しなければなりません。 – MvG

+0

単一の値を持つ列挙型が機能する可能性があります –

関連する問題