6

Google Closure でArray、特定の@type {Array.<type>}が初期化されている場合、Google Closure が配列の内容を確認できると確信できますか?

ここに小さなテストケースがあります。aは同じチェックによって正しくブロックされていますが、 an がチェックを{Array.<string>}すり抜けているように見えます。私はGCに少し慣れていませんが、これは私の側のエラーですか?{Array.<number>}{string}

これをGoogle Closure Serviceに貼り付けましたが、予想される 2 つのエラー (2013 年 9 月 12 日) のうちの 1 つしか表示されません。ADVANCED_OPTIMIZATIONSwarning_level VERBOSE. _ {Array.<string>}それはまだこっそり通り過ぎるように見えます。

ドキュメント: Google クロージャーの注釈

ご意見をお寄せいただきありがとうございます。

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @warning_level VERBOSE
// @language ECMASCRIPT5
// ==/ClosureCompiler==

/**
    no warning, as expected:
    @type {Array.<number>}
*/
var a = [1,2,3,4];

/**
    warning! Type mismatch as expected:
    @type {Array.<number>}
*/
var b = 'mismatch';    // {string} does not match {Array.<number>}

/**
    no warning, but Type mismatch was expected:
    @type {Array.<number>}
*/
var c = ['foo','bar']; // {Array.<string>} should not match {Array.<number>}


// prevent compile-to-zero
alert(a);
alert(b);
alert(c);

注: Array.push() のタイプが手動で入力されたこの関連する質問を 詳しく調べました。ただし、この質問は初期化に関するものです。上記のように、彼の修正されたコードを取得し、すべての配列をガベージ データで初期化すると、GC は彼の場合もガベージをキャッチできません。

編集済み:念のため、テスト ケースのヘッダーにwarning_level VERBOSEとを追加しました。まだ検出されていません。language ECMASCRIPT5{Array.<string>}

4

1 に答える 1

4

これは、現在の型チェッカーの制限です。右側の had 側は、それぞれ " " または " "ではなく " Array" (別名) として型付けされ、任意の型に割り当てることができます。Array<?>Array<number>Array<string>

この特定のケースでは型チェッカーを強化することは可能ですが、JavaScript では配列が可変であるため、より複雑なケースではすぐに機能しなくなります。つまり、「[11]」が入力されたArray<number>場合、他のタイプを追加することは違法になりますが、配列は一般に同種ではありません。

var args = [];
args[0] = 1;
args[1] = 'foo';

したがって、Array の型はデフォルトで初期型に限定されてはなりません。

于 2013-09-15T22:15:37.753 に答える