【问题标题】:Google JavaScript closure: defining a structure passed to many functionsGoogle JavaScript 闭包:定义传递给许多函数的结构
【发布时间】:2014-05-19 00:51:06
【问题描述】:

当我使用 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
 */

或者您会将其作为外部定义执行,以便至少执行环境看不到该定义?

附:有问题的对象从不保存设置。它使用该结构 来保存它生成的数据(例如标识符)并了解用户希望不同功能做什么。每个调用者可以有一组不同的设置,并且对象本身仍然可以像单例一样运行(我只需要对象的一个​​实例来管理任意数量的 windows)。

【问题讨论】:

    标签: javascript types google-closure-compiler


    【解决方案1】:

    是的,你可以使用@typedef

    /**
     * @typedef {{p1: string, ...}}
     */
    var Settings;
    

    及以后:

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

    【讨论】:

    • 所以我想这个var Settings; 定义应该在一个外部的.js 文件中?因为我不太确定它在我的代码中的位置!
    • 视情况而定。如果您为代码命名空间(使用goog.provide),则可以在创建命名空间的文件中使用my.name.space.Settings; 而不是var Settings;
    • 嗯......在我看来,如果在命名空间中定义(我确实有一个),那么即使它不是对象的变量,它也会在运行时出现在对象中,它是“外部的”。
    • 只写my.name.space.Settings; 不会创建属性Settings,因为您没有分配属性。从技术上讲,您正在尝试访问属性Setting,它不存在。我也相信闭包编译器会从源代码中删除 typedef,但这可能取决于编译级别。
    • 嗨,我认为您需要提供my.name.Settings,然后才能将其设置为包级别类型,因此,它不应该是undefined。在这里,您的示例有一个private 定义,这里似乎是undefined。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2012-05-09
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多