在使用Closure Compiler进行编译时,我收到了从另一个类继承的每个Ecmascript 6类的警告:
我尽可能地减少了事情,但仍然得到警告:
/src/main/js/com/tm/dev/Dog.js: WARNING - Bad type annotation. Unknown type module$$src$main$js$com$tm$dev$Animal.default
编译后的代码运行正常。 (我尝试过一些注释只会让事情变得更糟。)任何人都知道这里的预期是什么吗?
Animal.js:
export default class{
constructor(){
this.legs = [];
}
addLeg(legId){
this.legs.push( legId );
}
}
Dog.js:
import Animal from './Animal';
export default class extends Animal {
constructor(){
super();
[1,2,3,4].forEach(leg=>this.addLeg(leg));
console.log( 'Legs: ' + this.legs.toString() );
}
}
答案 0 :(得分:1)
警告信息中有提示,但如果您不熟悉Closure Compiler's annotation inspection,则显然会感到困惑。
Closure Compiler可以使用有关JavaScript变量的数据类型信息来提供增强的优化和警告。但是,JavaScript无法声明类型。
由于JavaScript没有声明变量类型的语法,因此必须在代码中使用注释来指定数据类型。
(以下是未经测试的。)
Closure Compiler报告在Dog.js
中它无法识别"类型" Animal
。这是因为您要导出一个未命名的类表达式:export default class
。
因此,您可以为您的班级命名(export default class Animal
),Closure Compiler可能会在Animal
消费时识别该标记Dog.js
。
您还可以为您的班级提供一个JSDoc,将其标记为@constructor
:
/**
* Animal.
* @constructor
*/
export default class Animal {}