コンストラクタ関数のObjectを返すライブラリの型チェックをしようとしています。私はコンストラクタ関数を含むオブジェクトのクローズコンパイラアノテート
const Foo = /** @type{!Foo.Module} */ require('foo');
const wheel = new Foo.Wheel();
wheel.rotate();
externs-を使用しているコード -
私のアプリ-code.js:で、次のコードを閉鎖エラーで:
./my-app.js:11: ERROR - Cannot call non-function type Foo.Wheel
const wheel = new Foo.Wheel();
^
ここではコードの構造ですfoo.js - Fooライブラリのクロージャーエクスターナル
/** @const */
const Foo = {};
/** @record */
Foo.Module = function() {};
/** @type {!Foo.Wheel} */
Foo.Module.prototype.Wheel;
/** @constructor */
Foo.Wheel = function() {};
/**
* @returns {void}
*/
Foo.Wheel.prototype.rotate = function() {};
foo/index.js - Foo.Moduleタイプに対応します。
module.exports = {
Wheel: require("./wheel"),
};
FOO/wheel.js - Foo.Wheelに相当します。
function Wheel() {}
Wheel.prototype.rotate = function() {};
module.exports = Wheel;
私は、次のような結果とexterns-foo.js
上の一つのバリエーションを試してみました。
でFoo.module.prototype.Wheel
機能
/** @return {!Foo.Wheel} */
Foo.Module.prototype.Wheel = function() {};
エラーを行います。私はこの問題には2つの解決策を知ってる
my-app.js:11: ERROR - Expected a constructor but found type function(this:Foo.Module):Foo.Wheel.
const wheel = new Foo.Wheel();
my-app.js:13: ERROR - Property rotate never defined on module$myapp_Foo of type Foo.Module
wheel.rotate();
externsでは、Foo.Module.prototype.Wheel = Foo.Wheel;を実行してみてください。 –
注釈 "@type {!Foo.Wheel}"と "@return {!Foo.Wheel}"は、オブジェクトがFoo.Wheelのインスタンスであることを最初に示しているため、関数は戻りませんそのインスタンス。これらのシナリオは必要ありません。あなたが実際に望むものは実際にはコンストラクタです。 もう1つのオプションは、実際にはFoo.Wheelオブジェクトをインスタンス化するコンストラクタであることを示すtype {function(new:!Foo.Wheel)}を使用します。 –
ニース、ありがとう。 '@type {function(new:Foo.Wheel)}'は感嘆符なしで働いていました。あなたが答えを書いておきたいなら、それを受け入れるか、私は1日か2日以内に書くことができます。 – Joe