【问题标题】:Recursive types in closure compiler闭包编译器中的递归类型
【发布时间】:2012-12-24 07:40:04
【问题描述】:

有没有办法在闭包编译器的打字语法中定义recursive type?换句话说,我可以定义一个在其定义中包含自身的类型吗?

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

(旁注:是的,树的这个定义是错误的)

虽然上面的编译通过简单的优化,但它会因高级抛出以下错误而失败:

JSC_TYPE_PARSE_ERROR:错误的类型注释。第 3 行字符 17 处的未知类型树 * @type {{left: (Tree|null)}}

【问题讨论】:

    标签: javascript google-closure-compiler


    【解决方案1】:

    只是猜测,但你能把类型放在左边吗?

    /**
     * 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();
    

    【讨论】:

    • 嗯。显然我完全误解了@type 参数的工作原理,谢谢! (另外,我认为这个想法是简单地定义一个有效的构造而不是编写可执行代码:this.left 在构造函数中应该为 null ......再说一次,我是一个在简单语法上绊倒的人)
    • 另外我不使用'Tree.prototype.left = new Tree()'的原因是因为如果你这样做,那么你创建的每个树类型的对象,'left'属性将始终引用同一个 Tree 实例。通过在构造函数中实例化它,每次实例化一个新类型时,你都会为'left'属性获得一个新的 Tree 实例。希望我没有让解释变得比需要的更复杂。
    • Tree 构造函数中实例化new Tree 是一种创建堆栈溢出的简单方法:-)
    【解决方案2】:

    /** * @typedef{{left:Tree}} */ 变种树;

    /** * @界面 */ var Tree =function(){}

    /** @type {树} */ 树.prototype.left;

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多