这与此问题有关:Can I import a TypeScript class from my own module to global?
我制作了一个模块,我希望将一个类暴露给全局范围。
module Foo {
export class Bar {
x: number
}
/* Some more interfaces and classes to be used only in this module */
}
首先,我创建了一个接口并定义了一个新变量来实现这一目标。
interface Bar extends Foo.Bar {
}
var Bar = Foo.Bar;
生成的JavaScript将我的Bar作为变量。
var Foo;
(function (Foo) {
var Bar = (function () {
function Bar() {
}
return Bar;
})();
Foo.Bar = Bar;
})(Foo || (Foo = {}));
var Bar = Foo.Bar;
//# sourceMappingURL=app.js.map
d.ts文件包含我的全局Bar接口和变量。
declare module Foo {
class Bar {
public x: number;
}
}
interface Bar extends Foo.Bar {
}
declare var Bar: typeof Foo.Bar;
然后,我注意到我可以简单地使用import
来公开我的课程,我就这样做了。
import Bar = Foo.Bar;
生成的JavaScript文件完全相同。
var Foo;
(function (Foo) {
var Bar = (function () {
function Bar() {
}
return Bar;
})();
Foo.Bar = Bar;
})(Foo || (Foo = {}));
var Bar = Foo.Bar;
//# sourceMappingURL=app.js.map
但是,我的d.ts文件现在不包含有关全局条的任何信息。
declare module Foo {
class Bar {
public x: number;
}
}
这是预期的结果吗?我认为这会导致错误,因为当我在其他项目中包含JavaScript文件和d.ts文件时,它会允许声明具有相同名称的变量。
答案 0 :(得分:1)
这是当前编译器中的一个错误,新的编译器似乎修复了这个问题。请参阅:https://github.com/Microsoft/TypeScript/issues/346
更正声明:
declare module Foo {
class Bar {
x: number;
}
}
import Bar = Foo.Bar;
答案 1 :(得分:0)
使用import语句时,编译器会假定该定义位于其他位置。
例如,如果您将fileA.ts
中的内容导入fileB.ts
,则生成的fileA.d.ts
已包含声明,如果包含此声明,则会与fileB.d.ts
冲突声明。
所以我会说这种行为是故意的。