Closure Compiler - 无法解析@extends标记中的类型

时间:2016-03-19 15:04:40

标签: javascript google-closure-compiler

当我使用 ADVANCED_OPTIMIZATIONS 进行编译时,

Closure Compiler会输出一个奇怪的警告。

您可以在Closure Compiler UI

中看到它

使用接口编译此代码时会出现警告 - @interface

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

/**
 * @interface
 * @extends {IReused}
 */
function IRegistration() {
}

/**
 * @interface
 */
function IInitializable() {
}

/**
 * @param {IReused} initializer
 */
IInitializable.prototype.initializedBy = function (initializer) { };

/**
 * @interface
 * @extends {IOwned}
 */
function IReused() {
}


/**
 * @interface
 */
function IOwned() {
}

输出:

WARNING - Could not resolve type in @extends tag of IRegistration
function IRegistration() {
^
0 error(s), 1 warning(s)   

但是当我使用@constructor将所有接口更改为类时,一切正常。

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

/**
 * @constructor
 * @extends {IReused}
 */
function IRegistration() {
}

/**
 * @constructor
 */
function IInitializable() {
}

/**
 * @param {IReused} initializer
 */
IInitializable.prototype.initializedBy = function (initializer) { };

/**
 * @constructor
 * @extends {IOwned}
 */
function IReused() {
}


/**
 * @constructor
 */
function IOwned() {
}

当我从initializedBy函数中删除IReused参数时使用接口时,一切都按预期工作。

/**
 * @interface
 * @extends {IReused}
 */
function IRegistration() {
}
...


/**
 * @param {IReused} initializer
 */
IInitializable.prototype.initializedBy = function (initializer) { };

To ->

/**
 * @param {*} initializer
 */
IInitializable.prototype.initializedBy = function (initializer) { };

有人可以解释一下我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

问题是,在IReused中使用IOwned后,您已定义IRegistration// ==ClosureCompiler== // @output_file_name default.js // @compilation_level ADVANCED_OPTIMIZATIONS // ==/ClosureCompiler== /** * @interface */ function IOwned() { } /** * @interface * @extends {IOwned} */ function IReused() { } /** * @interface * @extends {IReused} */ function IRegistration() { } /** * @interface */ function IInitializable() { } /** * @param {IReused} initializer */ IInitializable.prototype.initializedBy = function (initializer) { };

如果你只是将装潢移动起来,那就可以了。 在编译器UI here中查看它。

这也是代码的样子:

{
    foo: {
        bar: 1,
        baz: 2,
        qux: 3
    }
}