我正在尝试公开函数的返回类型,其中返回类型是在函数自己的范围内定义的。
// ==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
。有没有办法通过类型检查来编译这个模式?
答案 0 :(得分:0)
可能无法找到类型,因为MyType
作为类型在您创建instance
时无法使用(无法执行新的MyType()或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)
答案 1 :(得分:0)
问题是“MyType”的范围是“func”,并且在外面不可用。您可能最好在全局范围内定义@interface,并在定义函数之外使用该类型。