如何正确使用JSDoc与Closure Compiler相同地重命名属性?

时间:2015-07-31 21:16:49

标签: google-closure-compiler jsdoc

我有一个函数,它接受类似字典的对象,并且必须提取一个特定的属性并迭代可能的嵌套子元素:

function process(obj){

    //extract ID
    let secret = obj.secret;
    delete obj.secret; // yes, I have to delete that property, not just set to null

    // do some stuff

    if (Array.isArray(obj.others)) {

        // Extract others
        let others = obj.others;
        delete obj.others; // yes, I have to delete that property too

        // Process children too
        others.forEach(foo);
    }
}

我使用此函数来处理对象:

class MyClass {

    contructor() {
        //init
    }

    getDictionary() {

        return {
            secret: 123,
            baz: 'baz',
            bar: 'bar',
            others: [{
                    secret: OtherClass,
                    forbar: 'foobar',
                    others: [{...},...]
                },{
                    ...
                }]
        };
    }

    parse() {
        return process(this.getDictionary());
    }
}

Closure编译器总是重命名" obj.secret"在进程函数中(类似于)" a.a",但并不总是重命名"秘密" getDictionary 返回的对象中的属性。如果是这样,他们就没有重新命名"秘密"财产相同。

我不想导出那些 - obj [' secret'] :我希望将它们重命名。我在Closure Compiler guide中寻找JSDoc注释,但我不知道该怎么做。

特别是如何定义字典,具有强制性"秘密"属性(类型:数字或某类),可选"其他" property(是相同结构的字典数组)和零个或多个字符串属性。

1 个答案:

答案 0 :(得分:0)

您有2个选项:

禁用基于类型的优化

设置--use_types_for_optimization=false标志。任何具有相同名称的属性都将被重命名 - 无论它们是否相关。

实施接口

为编译器提供足够的类型信息,以便识别属性是相关的,并且必须一致地重命名:

/** @interface */
function MyDictionary() {}

/** @type {number} */
MyDictionary.prototype.secret;

/** @type {MyDictionary} */
MyDictionary.prototype.others;

然后将类型注释添加到其他代码中:

/** @return {MyDictionary} */
getDictionary() { ... }

/** @param {MyDictionary} obj */
function process(obj){ ... }

您可能还需要从getDictionary方法输入返回的对象。