GoogleJavaScript闭包:定义传递给许多函数的结构

GoogleJavaScript闭包:定义传递给许多函数的结构,javascript,types,google-closure-compiler,Javascript,Types,Google Closure Compiler,当我使用Google闭包编译器来增强JavaScript代码时,我遇到了一个我不喜欢的问题 我有一个简单的类,有4个函数: open: function(settings) { ... }, close: function(settings) { ... }, hide: function(settings) { ... }, show: function(settings) { ... } 正如您所看到的,所有函数都接受一个名为settings的对象。我可以使用强类型定义轻松声明设置,

当我使用Google闭包编译器来增强JavaScript代码时,我遇到了一个我不喜欢的问题

我有一个简单的类,有4个函数:

open:  function(settings) { ... },
close: function(settings) { ... },
hide:  function(settings) { ... },
show:  function(settings) { ... }
正如您所看到的,所有函数都接受一个名为settings的对象。我可以使用强类型定义轻松声明设置,例如:

/**
 * @param {{p1: string, p2: number, p3: function(string)}} settings The settings.
 */
open: function(settings) { ... };
这是可行的,只是我需要为每个打开、关闭、隐藏和显示函数复制/粘贴@param定义。因此,如果我添加一个参数,我将确保更新所有4个函数

有没有一种方法可以声明一个类型,然后多次重用它,而不必声明一个实际的JavaScript对象?也许是这样的

/**
 * @deftype {{...}} some_name
 */
或者您会将其作为一个外部定义来执行,这样至少执行环境不会看到该定义

另外,问题对象从不保存设置。它使用该结构来保存它生成的数据(例如标识符),并知道用户希望不同的函数做什么。每个调用者可以有一组不同的设置,并且对象本身仍然可以像一个单例一样工作(我只需要一个对象实例来管理任意数量的窗口)。

是的,您可以使用:

后来:

/**
 * @param {Settings} settings The settings.
 */
open: function(settings) { ... };

所以我假设这个
var设置定义应该在外部.js文件中吗?因为我不太确定它是否适合我的代码!视情况而定。如果为代码命名名称空间(使用
goog.provide
),则可以使用
my.name.space.Settings而不是
var设置,在创建名称空间的文件中。嗯。。。在我看来,如果在名称空间中定义(我确实有一个名称空间),那么它将在运行时出现在对象中,即使它不是对象的变量,它是对象的“外部”变量不会创建属性
设置
,因为您没有指定属性。从技术上讲,您正试图访问不存在的属性
设置
。我还认为闭包编译器会从源代码中删除typedef,但这可能取决于编译级别。您好,我认为您需要提供
my.name.Settings
,然后才能使其成为包级别的类型,因此,它不应该是
未定义的
。在这里,您的示例有一个
private
定义,它在这里似乎是
未定义的
。有什么想法吗?
/**
 * @param {Settings} settings The settings.
 */
open: function(settings) { ... };