我的项目使用了多文件内部模块'做法。在构建期间,所有内容都被编译为单个Javascript文件。
仍然困扰我的一件事是,我无法找到一种方法来拥有私有模块级别类(不会导出到定义文件),这些类仍然可以被驻留在单独文件中的同一模块中的类看到和使用(即C#内部课程)。有什么建议吗?
Foo.ts:
module shared {
class Foo {
}
}
Bar.ts:
module shared {
export class Bar {
constructor() {
this.foo = new shared.Foo();
}
}
}
Baz.ts:
module shared {
export class Baz {
constructor() {
this.foo = new shared.Foo();
}
}
}
答案 0 :(得分:2)
没有语言方面的解决方案。这就是为什么会出现这种情况的两个方面 - 代码的消费者看到了什么,以及JavaScript是如何发布的。
从发射方面,shared::Foo
是shared
对象的导出成员,或者不是。如果未导出,则shared:Baz
无法看到它,也无法使用它。因此,模块中的任何“内部”类显然都需要以发射方式导出。
从消费方面来说,这里有一个微妙的危险。让我们说这发生了:
// ** YourCode.d.ts **
declare module shared {
class Bar { ... }
class Baz { ... }
}
// ** SomeConsumer.ts **
// Hey, 'shared' is a good namespace!
module shared {
// My own personal Foo
export class Foo {
}
}
刚刚发生了什么?您的代码的用户只是在没有意识到的情况下踩到shared.Foo
成员。一切都会在运行时破坏。打破宇宙的一组危险成员是一个无证件的雷区。
最好的解决方案,如果你有一些应该在外部使用的成员,而另一些则不应该使用一个名为Internal
或Implementation
的嵌套模块,以便消费者知道他们不应该实际上自己使用这些对象。