【问题标题】:Closure Compiler Externs - WARNING - Property never defined onClosure Compiler Externs - 警告 - 从未定义过的属性
【发布时间】:2015-12-10 02:36:17
【问题描述】:

我正在为 PIXI.js 库准备 externs。我收到以下警告:

js/Test.js:188: WARNING - Property position never defined on PIXI.Sprite
        button.position.y = y;

以下是相关的外部定义:

//更新

/** 
 * @constructor
 * @extends {PIXI.Container} 
 * @param {PIXI.Texture} texture
 */
PIXI.Sprite = function(texture){};

/** 
 * @constructor
 * @extends {PIXI.DisplayObject} 
 */
PIXI.Container = function(){};

/**
 * @constructor 
 * @extends {PIXI.EventEmitter} 
 */
PIXI.DisplayObject = function(){};

/**
 * @type {PIXI.Point}
 */
PIXI.DisplayObject.position;

仍然收到同样的警告。

我做错了什么?

当我用PIXI.DisplayObject.prototype.position; 替换PIXI.DisplayObject.position; 时,似乎清除了警告。

这是否意味着我应该始终定义 SomeObject.prototype.prop 而不是 SomeObject.prop

【问题讨论】:

  • 闭包编译器不理解 @member@memberof@class 注释。此外,您的 @extends 注释需要大括号:@extends {parentType}。这是编译器理解的注解参考:developers.google.com/closure/compiler/docs/js-for-compiler
  • @ChadKillingsworth 谢谢你的评论,我做了更正,仍然收到同样的警告。我更新了问题。如果我添加prototype,它似乎可以工作。我应该总是定义SomeObject.prototype.prop 而不是then SomeObject.prop 吗?

标签: google-closure-compiler pixi.js


【解决方案1】:

这突出了静态属性和原型属性之间的区别。

给定:

/**
  * @constructor
  * @param {number=} opt_num
  */
function foo(opt_num) {
    if (opt_num !== undefined) {
        this.bar = opt_num;
    }
}
foo.prototype.bar = 17;
foo.bar = 42;

我们有同名的静态属性和原型属性。但是它们的引用方式不同:

console.log((new foo()).bar); // 17
console.log((new foo(0)).bar); // 0
console.log(foo.bar); // 42

所以在 extern 中,当您在类型上定义属性时 - 您通常希望在原型对象上定义它们:

/** @param {foo} obj_foo */
function log(obj_foo) {
   // This is an instance of "foo".
   // The "bar" property references prototype or instance
   // properties - not static properties.
   console.log(obj_foo.bar);

   // Static properties can only be referenced by the full namespace
   console.log(foo.bar);
}

【讨论】:

  • 感谢您对这个主题提供有用的信息 :) 我查看了几个 externs 文件,我注意到在 github.com/google/closure-compiler/blob/master/contrib/externs/… 中几乎没有定义 @private 函数,我很好奇它的用途是什么如果这些应该是私有的?
  • 这是externs中的一个“技巧”。它是由另一个函数创建的类型。这是一种古老的风格。现在我们只使用接口,因为它们无论如何都不能直接创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多