TypeScript:模块x无法与其他文件中先前的x声明合并
我有一个typescript项目,其中一个模块被分割成多个文件。有一个与此模块同名的类通过声明合并来获取嵌套类,但编译器抛出错误:TypeScript:模块x无法与其他文件中先前的x声明合并,typescript,Typescript,我有一个typescript项目,其中一个模块被分割成多个文件。有一个与此模块同名的类通过声明合并来获取嵌套类,但编译器抛出错误: Bar.ts(1,1):错误TS2188:模块'Foo'无法与另一个文件'path/to/my/file/Foo.ts'中以前的'Foo'声明合并。 文件'Foo.ts' class Foo { constructor() { } } 文件'Bar.ts' module Foo { export class Bar { c
Bar.ts(1,1):错误TS2188:模块'Foo'无法与另一个文件'path/to/my/file/Foo.ts'中以前的'Foo'声明合并。
文件'Foo.ts'
class Foo {
constructor() {
}
}
文件'Bar.ts'
module Foo {
export class Bar {
constructor() {
}
}
}
我正在使用tsc Foo.ts Bar.ts--declaration--out Foo.js编译
我的主要问题是,我希望能够使用var bar=newbar()代码>在我的Foo类中,我认为合并应该提供哪种声明(语言规范在这里并没有真正帮助我)。现在我必须使用var bar=new Foo.bar()代码>,这很烦人
我是做错了什么,还是这是一个编译器错误
顺便说一句,--声明似乎不起作用,希望这是由这些错误引起的。如果您的主要要求是使用较短的新的Bar()
而不是新的Foo.Bar()
,那么最好将它们放在同一个模块中。。。如果我创建一个名为Baz的模块,我可以在第二个文件中扩展它,并使用缩写newbar()
,而不是new Baz.Bar()代码>
请记住,这将创建一个定向依赖项-Bar.ts需要在Foo.ts之前加载
酒吧
module Baz {
export class Bar {
constructor() {
}
}
}
福茨
module Baz {
class Foo {
constructor() {
var x = new Bar();
}
}
}
但是,如果您的主要需求是能够创建一个new Foo()
以及一个new Foo.Bar()
,那么您可以使用一个模块扩展该类。。。但是您必须调用new Foo.Bar()
——不能使用缩短的new Bar()
模块和类可以在以下限制下合并:
模块必须在类之后
它们必须在同一个文件中
如果你看一下代码生成,规则#1的原因就显而易见了——在JavaScript中,你可以向函数(在本例中为构造函数)添加属性,但你不能将现有对象转化为函数
#1是#2的结果,因为对于并行编译,无法强制一个脚本先于另一个加载,如果顺序错误,您将看到的行为将很难调试。感谢您的回答。我不知道我的英语是否足以完全理解你的意思,但我阅读了语言规范,当我看到合并类和内部模块时,
,我认为在所描述的情况下这应该不会是问题。所以我现在想做的是不可能的?是可能的-但你必须使用全名。。。让我添加一个例子…感谢您的澄清,我将不得不重新思考我的架构。我只是认为这是声明合并中的一个bug。谢谢你的回答。我知道这些限制,我通过使用--out
将所有文件编译成一个文件来解决这些限制。
class Foo {
private x;
constructor() {
this.x = new Foo.Bar();
}
test() {
return 'ftest+' + this.x.test();
}
}
module Foo {
export class Bar {
constructor() {
}
test() {
return 'btest';
}
}
}
var f = new Foo();
var b = new Foo.Bar();
alert(f.test()); // ftest+btest
alert(b.test()); // btest