2

コンストラクタ関数の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(); 
+0

externsでは、Foo.Module.prototype.Wheel = Foo.Wheel;を実行してみてください。 –

+1

注釈 "@type {!Foo.Wheel}"と "@return {!Foo.Wheel}"は、オブジェクトがFoo.Wheelのインスタンスであることを最初に示しているため、関数は戻りませんそのインスタンス。これらのシナリオは必要ありません。あなたが実際に望むものは実際にはコンストラクタです。 もう1つのオプションは、実際にはFoo.Wheelオブジェクトをインスタンス化するコンストラクタであることを示すtype {function(new:!Foo.Wheel)}を使用します。 –

+0

ニース、ありがとう。 '@type {function(new:Foo.Wheel)}'は感嘆符なしで働いていました。あなたが答えを書いておきたいなら、それを受け入れるか、私は1日か2日以内に書くことができます。 – Joe

答えて

2

  1. は、外部宣言ファイル内Foo.Module.prototype.Wheel = Foo.Wheel;を宣言。
  2. @type {function(new:Foo.Wheel)}を使用します。この関数は、実際はFoo.Wheelオブジェクトをインスタンス化するコンストラクタです。

私はコンストラクタ関数への参照を宣言しているので、コンパイラはコンストラクタのプロパティ(静的メソッドなど)にアクセスできるようにしています。 IIRCこれは解決策#2では実行できません。

注釈@type {!Foo.Wheel}@return {!Foo.Wheel}は、Foo.Wheelのインスタンスを参照しているため実際にはコンストラクタ自体が必要なため、機能しません。

関連する問題