2

我试图公开函数的返回类型,其中返回类型是在函数自己的范围内定义的。

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

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

  return new MyType();
}

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

当我在这里编译时,我得到两个类型错误,一个是@return注释,一个是@type注释。两个错误都说Unknown type MyType。有没有办法让这个模式通过类型检查来编译?

4

2 回答 2

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 回答
0

问题是“MyType”的范围是“func”,在外面不可用。您最好在全局范围内定义 @interface 并在定义函数之外使用该类型。

于 2013-06-10T05:36:02.683 回答