我有一个函数,它接受类似字典的对象,并且必须提取一个特定的属性并迭代可能的嵌套子元素:
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(是相同结构的字典数组)和零个或多个字符串属性。
答案 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
方法输入返回的对象。