2016-06-01 4 views
2

を拡張した場合、私は閉鎖コンパイラでコンパイルするとき、別のクラスから継承するすべてのECMAScriptの6クラスの警告を取得しています:閉鎖コンパイラは、「不正な型注釈を未知のタイプを...。」警告するの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:あなたはClosure Compiler's annotation inspectionに慣れていないのであれば、それは明らかに混乱することでしょうけれども

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

ヒントは、警告メッセージです。

クロージャコンパイラは、JavaScript変数に関するデータ型情報を使用して、最適化と警告を強化することができます。しかし、JavaScriptは型を宣言する方法がありません。

JavaScriptには変数の型を宣言する構文がないため、コード内のコメントを使用してデータ型を指定する必要があります。

(以下がテストされていません。)

閉鎖コンパイラはDog.jsで、それは "タイプ" Animalを認識していないことを報告しています。これは、名前のないクラス式export default classをエクスポートしているためです。

クラスを名前(export default class Animal)にして、で消費されたときにクロージャコンパイラがトークンAnimalを認識することがあります。

そして、あなたも、あなたのクラス@constructorとしてそれをマークしJSDocの与えることができます。それを追跡するため

/** 
* Animal. 
* @constructor 
*/ 
export default class Animal {} 
+1

感謝を。これはバグです。この問題を提出できますか? https://github.com/google/closure-compiler/issues –

+0

@ChadKillingsworth確か:-)名前のないクラスのインポート名を型として認識しないというバグはありますか? – sdgluck

+2

([ここに提出された問題](https://github.com/google/closure-compiler/issues/1825)) – sdgluck

関連する問題