13

Closure Compiler を使用してかなり大きなライブラリを実行すると、多くの"Unknown type"警告が表示されます。これらの警告は、型が自己実行型の無名関数で宣言されている場合に発生するようです。これには特別なことは何もありませんが、自己実行関数を取り除くと、型宣言が機能するように見えます (少なくともこの単純なテストでは)。

コードの注釈に何か問題があるのか​​、それともコードに違法なものがあるのか​​ はわかりませんが、これはすべてコーシャであり、API をモジュール化する標準的な方法だと思います。

次のテスト コードは、名前空間 (単純な古い JS オブジェクト) を作成し、列挙型 (オブジェクト リテラル) と関数を関連付けます。

var mynamespace = {};
(function (mynamespace) {
    /**
     * Some enum.
     * @enum {number}
     */
    mynamespace.SomeEnum = {
        FOO: 1,
        BAR: 2
    };

    /**
     * Frazzle some type.
     * @param {mynamespace.SomeEnum} qux The type to frazzle.
     * @return {boolean} whether the operation succeeded.
     */
    mynamespace.frazzle = function(qux) {
        return true;
    }
}(mynamespace));

// call it
mynamespace.frazzle(mynamespace.SomeEnum.FOO);

いいですね。クロージャー コンパイラ エラー:

[jscomp] Compiling 1 file(s) with 37 extern(s)
[jscomp] X:\dev\solclientjs\sdk\tools\jscomptest.js:14: WARNING - Parse error. Unknown type mynamespace.SomeEnum

[jscomp]      * @param {mynamespace.SomeEnum} qux The type to frazzle.
4

4 に答える 4

3

編集:

元の答えは完全にオフでした。

これは間違いなくコンパイラのバグのようです。この正確な問題のバグレポートは見つかりませんでしたが、この問題の逆に対処しているように見える2つのバグレポートが見つかりました(コンパイラは警告をスローするはずですが、無名関数のラップを解除しない限り、警告はスローされません)。

http://code.google.com/p/closure-compiler/issues/detail?id=134

http://code.google.com/p/closure-compiler/issues/detail?id=61

いずれにせよ、型式で使用すると無名関数は不安定に見えます。

于 2011-03-03T06:10:32.207 に答える
1

ClosureCompilerはここで改善されました。上記のコードを修正して認識されるようにするために必要なのは、名前空間を@constとして宣言することだけです。

/ ** @const * / var mynamespace = {};

次に、タイプが認識されます。

于 2013-02-03T21:49:50.277 に答える
0

Closure Compiler は、ローカル型名をサポートしていません。名前はグローバルである必要があり、関数「mynamespace」内ではローカル名です。

于 2011-03-04T17:06:31.337 に答える