【问题标题】:Google closure compiler, JSC_INEXISTENT_PROPERTY issue with mixin/extendGoogle 闭包编译器,混入/扩展的 JSC_INEXISTENT_PROPERTY 问题
【发布时间】:2014-12-29 10:27:19
【问题描述】:

以下代码在使用 google 闭包编译器高级模式编译时会引发警告/错误。

JSC_INEXISTENT_PROPERTY:从未在播放器上定义属性 getJerseyNumber

有什么想法可以解决这个问题吗?

var getDetails = {
    getJerseyNumber: function() {
    return Math.random();
    }
};

/**
 * @param {Object} source
 * @param {Object} delta
 */
function mixIn(source, delta) {
    for (var i in delta) {
        source[i] = delta[i];
    }
}
/**
 *  @type  {{name: string , sport: string}}
 */
var player = {
    name: 'Tom Brady',
    sport: 'Football'
};

mixIn(player, /** @lends {player} */ getJerseyNumber);

alert(player.getJerseyNumber()); 

使用@lends 仅适用于对象字面量。所以添加这条线会起作用,但还有其他想法吗?

mixIn(player, /** @lends {player} */ {
    getJerseyNumber: function() {
        return Math.random();
    }
 });

【问题讨论】:

    标签: javascript build compiler-errors compiler-warnings google-closure-compiler


    【解决方案1】:

    根据Closure documentation

    @lends

    表示对象字面量的键应被视为其他对象的属性。 这个注解应该只出现在对象字面量上。

    jsdoc-toolkit对此进行了更详细的描述。


    对于您的示例,我将使用类来实现常见行为。

    /**
     * @constructor
     * @param {string} name
     * @param {string} sport
     */
    var Player = function(name, sport) {
        this.name = name;
        this.sport = sport;
    };
    
    Player.prototype.getJerseyNumber = function() {
        return Math.random();
    };
    
    var player = new Player('Tom Brady', 'Football');
    
    alert(player.getJerseyNumber());
    

    当然,我想你的例子有一些额外的复杂性,但没有代码来表示这种复杂性,我只能猜测那是什么。

    您可能会在建议的(但尚不存在)@mixin 注释之后。

    【讨论】:

    • 提供的代码示例很好地演示了解决上述问题,但基本上我正在寻找一种方法让编译器识别多个 mixin。这是 JS 编程的一个方便的构造,并且被大量使用(使用它的一个流行的代码库是 jquery)。看起来这将不得不等到这个 mixin 功能登陆谷歌闭包编译器。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多