【问题标题】:Calling a TypeScript module from javascript via RequireJS通过 RequireJS 从 javascript 调用 TypeScript 模块
【发布时间】:2013-11-08 22:15:09
【问题描述】:

在 javascript 中访问 TypeScript 模块时,我似乎必须进行完整命名。这是正确的吗?

我的 TypeScript 是:

export module App.editor.menu {

    export class File {
        static isOpenEnabled() {
            return false;
        }

        static openClicked() {
            debugger;
        }
    }
}

我的 javascript 是:

Ext.onReady(function () {

    define(["../../scripts/ribbon", "./menu-handler"], function (ribbon, handler) {

我必须调用“handler.App.editor.menu.File.isOpenEnabled()”而不是“handler.isOpenEnabled()”

我见过的所有示例都不需要包含命名空间。但是我没有看到任何一半是 TypeScript,一半是 JavaScript 的例子,所以我认为这可能会有所不同。

在这种情况下是否需要完整的命名空间?

【问题讨论】:

    标签: javascript requirejs typescript


    【解决方案1】:

    命名空间的想法是您希望避免名称冲突并明确指定特定类型或变量的域。这在 .NET 之类的东西中很重要,因为所有必需类型的传递闭包都被加载到一个域中,并且名称冲突会很成问题。

    在外部模块中,这是完全没有必要的,因为加载您的代码会准确定义您绑定到的标识符,而调用者只会“看到”他们明确导入的代码。

    一般情况下,您应该拥有唯一顶级元素为 export module 的 TypeScript 文件。把所有东西都移到外面并在上面加上export,这样你的来电者就可以更容易地找到它。在您的具体示例中,您的文件应该只是说:

    export class File { ... }
    

    不在一个模块中(除非您确实想通过一个外部模块公开一堆其他细分,这是不太可能的)。

    【讨论】:

    • 如果我去掉 Module 部分,如果我在别处创建另一个 File 类,这是否意味着名称冲突?
    • 没有。这就是外部模块的全部想法 - 默认情况下它们位于不同的命名空间中。
    • 感谢瑞恩提供的信息。我对 RequireJS 做的不多,我一直对此感到好奇。另外,我对您的答案进行了小修改。 :)
    • 首先谢谢你。我想确保我理解这一点。只要我在 .js 文件中没有全局代码,并且我总是使用 RequireJS define() 访问它,那么我可以拥有 8 个具有相同类名的 .js 文件,并且因为我通过 define() 获取对象,所以我'很安全,因为我只使用返回的对象。这是正确的吗?
    • 而且……这应该怎么做?在这种情况下不使用命名空间对我来说是非常错误的,因为我来自 C#/Java 世界。这是正确的做法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2015-08-14
    • 2014-10-05
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多