2012-12-22 32 views
1

有沒有辦法在閉包編譯器的鍵入語法中定義recursive type?換句話說,我可以定義一個包含其定義的類型嗎?閉包編譯器中的遞歸類型

/** 
* A node on the tree. 
* @type {{left: (Tree|null)}} 
*/ 
var Tree = { 
    left: null 
}; 

(邊注:是的,樹的這個定義是錯誤的)

雖然上面有簡單的優化編譯,它無法與先進拋出以下錯誤:

JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type Tree at line 3 character 17 * @type {{left: (Tree|null)}}

回答

0

剛一個猜測,但你可以把類型放在左邊部分。

/** 
* Not sure what goes here 
*/ 
var Tree = { 
    /** 
    * @type {Tree} 
    */ 
    left: null 
}; 

也不要你需要一個構造類型

/** 
* @constructor 
*/ 
var Tree = function(){ 

    this.left = new Tree() 
}; 

/** 
* @type {Tree} 
*/ 
Tree.prototype.left = null; 

只要你知道,你現在得到無限遞歸,如果你用實例類型

var test = new Tree(); 
+0

呵呵。顯然我完全誤解@type參數的工作原理,謝謝! (另外,我認爲這個想法是簡單地定義一個有效的構造,而不是編寫可執行代碼:this.left在構造函數中應該爲null ...然後再次,我是一個簡單的語法的絆腳石) – Casey

+0

好吧,很希望它有助於。 – Ally

+0

此外,我不使用'Tree.prototype.left = new Tree()'的原因是因爲如果你這樣做,那麼你創建的每個對象都是類型樹,'left'屬性將始終引用同一個實例樹。通過在構造函數中實例化它,每次實例化一個新類型時,都會爲'left'屬性獲得一個新的Tree實例。希望我沒有把這個解釋比它需要的更復雜。 – Ally

0

/** * @typedef {{left:Tree}} */ var Tree;

/** * @interface */ 變種樹=函數(){}

/** @type {樹} */ Tree.prototype.left;