当Ecmascript 6类被扩展时,Closure Compiler会警告“Bad type annotation.Nowknown type ...”

时间:2016-06-01 19:24:36

标签: class ecmascript-6 google-closure-compiler

在使用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() );
    }
}

1 个答案:

答案 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 {}