gpt4 book ai didi

javascript - 当代码包装在函数中时如何定义全局类型

转载 作者:搜寻专家 更新时间:2023-11-01 04:31:43 26 4
gpt4 key购买 nike

这个问题是关于正确使用 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);
}());

不过,我认为你的问题出在这里:

We have a convention that every javascript file is wrapped in a function.

闭包有不同的约定,即 define namespaces .

回答你的第二个问题,推荐的关闭方式是:

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();
};

关于javascript - 当代码包装在函数中时如何定义全局类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23703580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com