【问题标题】:Exposing local types in Closure Compiler在 Closure Compiler 中暴露本地类型
【发布时间】:2013-06-06 23:07:46
【问题描述】:

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

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

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

  return new MyType();
}

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

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

【问题讨论】:

    标签: javascript scope google-closure-compiler


    【解决方案1】:

    可能找不到类型,因为在创建instance 时,MyType 作为类型不可用(不能执行 new MyType() 或 instance 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)
    

    【讨论】:

    • 嗨 HMR,我相信这是它找不到类型的正确原因。第一个解决方案看起来接近我所追求的,但它接受任何类型,即函数中的 Object 实例,我希望找到一种方法让它只接受 instanceof MyType。 (IE.function func(){ return {}; } 编译没有错误,但我希望它有类型检查错误)
    • 我知道在那个外部范围内我不能在运行时做像instance instanceof MyType 这样的事情,因为MyType 在那个范围内不存在。但我希望它可以在编译时解决。
    • @Paulpro 我的猜测是,当您使用 JS 时找不到类型时,编译器也找不到,但我不确定编译器是如何做到的。我已经更新了我的答案,并认为您坚持使用 type 注释来定义它。它可以像您想要的一样复杂,但如果您可以将它分布在多行上会很好。还没找到办法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多