2012-12-22 29 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;