2

戻り値の型が関数自体のスコープ内で定義されている関数の戻り値の型を公開しようとしています。

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

/** @return {MyType} */
function func(){
  /** @constructor */
  function MyType(){}

  return new MyType();
}

/** @type {MyType} */
var instance = func();

これをここでコンパイルすると、@return注釈用と注釈用の 2 つの型エラーが発生し@typeます。どちらのエラーも言うUnknown type MyType。このパターンを型チェックでコンパイルする方法はありますか?

4

2 に答える 2

0

問題は、「MyType」が「func」でスコープされ、外部では使用できないことです。@interface をグローバル スコープで定義し、その型を定義関数の外で使用する方がよい場合があります。

于 2013-06-10T05:36:02.683 に答える
0

作成時にタイプが使用できないため、タイプが見つからMyTypeない可能性がありますinstance(new MyType()またはインスタンスinstanceof MyTypeを実行できません)。

これは、インスタンスと同じスコープに typedef を追加するか、MyType と同じスコープにインスタンスを作成することで修正できます。

両方:

/** @typedef {Object} */
var MyType;
/** @return {MyType} Returns new MyType **/
function func(){
  /** @constructor */
  function MyType(){
  }
  return new MyType();
}
/** @type {MyType} */
var instance = func();

と:

function func(){
  /** @constructor */
  function MyType(){
  }
  /** @type {MyType} */
  var instance = new MyType();
  return new MyType();
}

警告を生成しません

[アップデート]

注釈を介して複雑な型を提供するのは非常に困難です。必要に応じて型を複雑にすることができます。externs 変数とその関数は短い名前に変更されず (追加のコンパイル パラメーターがなければ)、型を再定義できないため、externs の使用は機能しません。したがって、基本的に typedef アノテーションを提供することに固執していると思います。

/** @typedef {{hands:number,doSomething:function(string):boolean}} */
var MyType;
/** @return {MyType} Returns new MyType **/
function func(){
  /** @constructor */
  function MyType(){
   this.hands=22;
  }
  MyType.prototype.doSomething=function(msg){
    return true;
  }
  return new MyType();
}
/** @type {MyType} */
var instance = func();
/** @type string */
var myString=instance.hands;//warning:found number required string
/** @type Array */
var myArray=instance.doSomething("hi");//found boolean required Array

instance.doSomething(22);//found number required string
instance.doSomething();//at leas 1 argument(s)
于 2013-06-07T00:56:47.277 に答える