簡體   English   中英

如何在代碼包裝在函數中時定義全局類型

[英]How to define global types when code is wrapped in functions

這個問題是關於正確使用Google Closure Compiler的類型注釋。

我們有一個約定,每個javascript文件都包含在一個函數中。 示例文件:

Square.js

(function() {
    'use strict';

    /**
     * @constructor
     */
    function Square() {};

    Square.prototype.draw = function() {
    };

}());

如果我們在這個函數中定義一個類型(比如構造函數),那么閉包編譯器在其他文件中並不知道它。 例如,在另一個文件中:

foo.js

(function() {
    'use strict';

    /** @param {Square} square */
    function drawSquare(square) {
        square.draw();
    }

}());

使用-W VERBOSE編譯會產生一個錯誤,即未定義Square類型:

foo.js:4: WARNING - Bad type annotation. Unknown type Square
        /** @type {Square} square */
                   ^

0 error(s), 1 warning(s), 83.3% typed

我們已經在單獨的文件中為所有類創建了externs來解決這個問題。 創建externs是一個糟糕的解決方案,因為現在我們必須為每個類維護兩個文件。

  1. 如果文件由文件級函數包裝,是否可以共享類型?
  2. 一般來說,在文件之間共享類型的推薦方法是什么? 使用閉包庫是否以任何方式提供/需要幫助?

我想你可以通過在封閉函數的限制范圍之外導出帶有你想要使用的名稱的符號來管理它。 像這樣的東西:

(function() {
    goog.provide('Square');
    //'use strict';

    /**
     * @constructor
     */
    function Square() {};

    Square.prototype.draw = function() {
      return "\\o/";
    };
    goog.exportSymbol('Square', Square);
}());

但是,我認為你的問題在這里:

我們有一個約定,每個javascript文件都包含在一個函數中。

Closure有一個不同的約定,即定義命名空間

要回答第二個問題,建議的關閉方式是:

goog.provide('my.Square');
/**
 * @constructor
 */
my.Square = function() {
};

my.Square.prototype.draw = function() {
  // TODO
};

和:

goog.provide('my.App');

goog.require('my.Square');


/**
 * @param {my.Square} square The square to draw
 */
my.App.prototype.drawSquare = function(square) {
  square.draw();
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM