TypeScript:模块x无法与其他文件中先前的x声明合并

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

我有一个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 {
        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