1

コンストラクタ関数のインスタンスではなく、Googleクロージャコンパイラを使用して複雑な関数型を参照するにはどうすればよいですか? クローズコンパイラexterns - 複雑な関数の参照

foo.jsは

/** @externs */ 

/** @const */ 
const CoolLibrary = {}; 

/** 
* @param {!Object} object The object to inspect. 
* @param {!Object} source The object of property values to match. 
* @param {!function(!Object): !Object} customizer The function to customize 
*  comparisons. 
* @return {boolean} Returns `true` if `object` is a match, else `false`. 
* @constructor 
*/ 
CoolLibrary.matchSomething = function(object, source, customizer) {}; 


/** 
* @param {string} src 
* @return {!Object} 
*/ 
function require(src) {} 
CoolLibrary.matchSomethingのための外部宣言 - -

externs.js私はそうのようにそれを呼び出すよ、アプリケーション・コード

goog.module('foo'); 

const isMatchWith = /** @type {!CoolLibrary.matchSomething} */ (require('coollibrary.matchsomething')); 

const foo = isMatchWith({}, {}, (val) => {}); 

java -jar closure-compiler-v20161201.jar --js=foo.js --externs=externs.js --new_type_inf 

ここで ' Closure Compiler Debugger

このエラーで実行可能なバージョン(S)

foo.js:3: WARNING - Bad type annotation. Unknown type Lodash.isMatchWith 
const isMatchWith = /** @type {!Lodash.isMatchWith} */ (require('lodash.ismatchwith')); 
           ^
0 error(s), 1 warning(s), 72.7% typed 

私は@typedefを使用する場合、それは動作しますが、それは情報のほとんどを失います。以下のようなtypedefを使うよりも、型情報を追加する良い方法はありますか?

/** @typedef {function(!Object, !Object, function(!Object):!Object):boolean} */ 
CoolLibrary.matchSomething; 

答えて

2

関数定義は型名ではありません。複数の場所で関数をインポートすると、typedefを使用してこのデータの再入力を防ぐことができます。しかし、情報を単一の場所にインポートするだけでは、typedefが過度に使用されます。

1回のインポートでは、require呼び出しでキャストされた型の関数アノテーションを単純に複製します。

const isMatchWith = 
    /** @type {function(!Object, !Object, function(!Object):!Object):boolean} */ 
    (require('lodash.ismatchwith')); 

コンパイラは、モジュールのバンドルを使用する場合は、あなたのためにこれらのケースを処理しますが、それは、コンパイラと互換性があり、コンパイルの一部として提供されるすべてのソース・ファイルが必要です。これは現在、外部ライブラリでは不可能です。

関連する問題