[英]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是一個糟糕的解決方案,因為現在我們必須為每個類維護兩個文件。
我想你可以通過在封閉函數的限制范圍之外導出帶有你想要使用的名稱的符號來管理它。 像這樣的東西:
(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.