声明命名空间外部模块的TypeScript?

声明命名空间外部模块的TypeScript?,typescript,amd,Typescript,Amd,我有一些遗留的js模块,它们要么在窗口上命名,要么在页面使用AMD时定义。例如: // foo/bar.js (function (root, factory) { if (typeof define === "function" && define.amd) { define(factory); } else { root.foo = root.foo || {}; root.foo.bar = factory()

我有一些遗留的js模块,它们要么在
窗口
上命名,要么在页面使用AMD时定义。例如:

// foo/bar.js
(function (root, factory) {
    if (typeof define === "function" && define.amd) {
        define(factory);
    } else {
        root.foo = root.foo || {};
        root.foo.bar = factory();
    }
} (this, function () {
    return {
        baz: function () {
            console.log("qux");
        }
    };
})); 
我们试图在以后的页面上开始使用TypeScript,但是我在创建能够正确设置外部模块的定义文件时遇到了问题。理想情况下,在TypeScript中,我希望能够
导入bar=require(“foo/bar”)

在研究了jquery.d.ts是如何实现的之后,我想到了:

    // foo/bar.d.ts
interface FooBar {
    baz: () => void;
}

declare module foo {
    export var bar: FooBar;
}    

declare module "foo/bar" {
    export = foo.bar; // Error: Could not find symbol 'bar'.
};

但是我在
export=foo.bar
上得到了错误。现在,我只是不声明外部模块,而是使用

将导出的项声明为变量,并使用适当的类型注释。下面是一个示例(尽管我不确定您想要导出什么)

这将产生一个全局变量
fb
,还支持通过
“foo/bar”
导入相同的“东西”

如果您的目标不是在全局范围内拥有一个项,则可以将该变量放入模块中,如下所示:

// foo/bar.d.ts
interface FooBar {
    baz: () => void;
}

declare module foo {
    export var bar: FooBar;
}    

declare module "foo/bar" {
    var fb: FooBar;

    export = fb;
}
示例调用代码

import foo = require("foo/bar");

var x = foo.baz();

没有全局
fb
,有什么方法可以做到这一点吗?因为这个全局变量实际上并不存在,我不希望我的其他开发人员认为它存在。在这种情况下,你可以把它放在模块内部-我已经为它添加了一个额外的例子。这正是我想要的。谢谢
import foo = require("foo/bar");

var x = foo.baz();