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編譯器?那意味着某種方式可以強制某個物品的某些特定物品不僅具有特定類型,而且具有固定的價值?並使用該值進行類型推斷,以區分工會中的不同選項?我沒有發現這種效果的文檔。

回答

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'屬性可以是兩個值中的任意一個,而不需要修改值和相應類型之間的鏈接。也許每種類型的單一元素「enum」都可以達到這個目的......將不得不稍微嘗試一下。 – MvG

+0

具有單個值的枚舉可能有效 –