通过RequireJS从javascript调用TypeScript模块

通过RequireJS从javascript调用TypeScript模块,javascript,requirejs,typescript,Javascript,Requirejs,Typescript,在javascript中访问TypeScript模块时,我似乎必须进行完整命名。这是正确的吗 我的打字稿是: export module App.editor.menu { export class File { static isOpenEnabled() { return false; } static openClicked() { debugger; } }

在javascript中访问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的例子,所以我想这可能会有所不同


在这种情况下需要完整的名称空间吗?

名称空间的思想是避免名称冲突,并明确指定特定类型或变量的域。这在.NET中很重要,因为所有必需类型的可传递闭包都被加载到一个域中,名称冲突将是非常有问题的

在外部模块中,这是完全不必要的,因为加载您的代码可以精确定义您绑定到的标识符,而调用方只能“看到”他们显式导入的代码

通常,您不应该有一个TypeScript文件,该文件的唯一顶级元素是导出模块。将所有内容移到外面,并将
export
放在上面,以便您的呼叫者更容易找到它。在您的特定示例中,您的文件应该只说:

export class File { ... }

不在一个模块中(除非你有一堆其他的子模块你真的想通过一个外部模块暴露出来,这是不可能的)。

如果我去掉了模块部分,如果我在别处创建另一个文件类,这不意味着名称冲突吗?不。这就是外部模块的全部想法-默认情况下,它们位于不同的名称空间中。感谢您提供的信息,Ryan。我对RequireJS没有做太多的工作,对此我一直很好奇。此外,我还对您的答案提交了一个小编辑:首先谢谢你。我想确保我明白这一点。只要.js文件中没有全局代码,并且我总是使用RequireJS define()访问它,那么我就可以有8个具有相同类名的.js文件,因为我通过define()获取对象,所以我很安全,因为我只使用返回的对象。这是对的吗?还有。。。应该这样做吗?在这种情况下不使用名称空间对我来说是非常错误的,因为我来自C/Java世界。这是正确的方法吗?