声明命名空间外部模块的TypeScript?
我有一些遗留的js模块,它们要么在声明命名空间外部模块的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()
窗口
上命名,要么在页面使用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();