Closure Compiler Externs - 警告 - 从未定义过属性

Jam*_*May 6 google-closure-compiler pixi.js

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

js/Test.js:188: WARNING - Property position never defined on PIXI.Sprite
        button.position.y = y;
Run Code Online (Sandbox Code Playgroud)

以下是相关的外部定义:

// UPDATE

/** 
 * @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;
Run Code Online (Sandbox Code Playgroud)

仍然得到同样的警告.

我究竟做错了什么?

当我更换PIXI.DisplayObject.position;使用PIXI.DisplayObject.prototype.position;,似乎清除警告.

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

Cha*_*rth 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;
Run Code Online (Sandbox Code Playgroud)

我们有一个同名的静态属性和原型属性。然而,它们的引用方式不同:

console.log((new foo()).bar); // 17
console.log((new foo(0)).bar); // 0
console.log(foo.bar); // 42
Run Code Online (Sandbox Code Playgroud)

因此,在 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);
}
Run Code Online (Sandbox Code Playgroud)