繁体   English   中英

在Closure Compiler中公开局部类型

[英]Exposing local types in Closure Compiler

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

// ==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 有没有一种方法可以使这种模式与类型检查一起编译?

可能找不到该类型,因为在创建instance时无法使用MyType作为类型(不能执行新的MyType()或MyType的instance instanceof)。

可以通过在与实例相同的作用域中添加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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM