查看以下代码:
module MyModule {
class MyPrivateClass {
...
}
export class MyPublicClass {
private var: MyPrivateClass; // MyPrivateClass is unknown
}
}
我希望 MyPrivateClass 仅在 MyModule 中可见,特别是在 MyPublicClass 中内部使用。在 MyModule 之外,只有 MyPublicClass 可见。我认为上面的布局应该可以,但VS抱怨 MyPrivateClass 在 MyPublicClass 中不可见。 在 MyPrivateClass 的定义之前添加导出使其对 MyPublicClass 可见,但是它也可以从外部看到。
有没有办法让它只对 MyPublicClass 可见?
谢谢。
答案 0 :(得分:7)
这是一个工作示例,它显示私有类,公共类,使用公共类中的私有类并尝试使用生成错误的私有类。
如果仍然出现错误,您是否能够披露您尝试用于导致问题的模块的名称?
module MyModule {
class MyPrivateClass {
doSomething() {
return 1;
}
}
export class MyPublicClass {
private x = new MyPrivateClass();
someFunction() {
return this.x.doSomething();
}
}
}
var examplePublic = new MyModule.MyPublicClass();
var result = examplePublic.someFunction(); // 1
var examplePrivate = new MyModule.MyPrivateClass(); // error
答案 1 :(得分:2)
如果您希望它在发出的JavaScript中是私有的,您可以通过将private clas实例移动到模块内部,而不是在导出的类的旁边来实现。
module MyModule {
class MyPrivateClass {
prop1: number = 1;
}
var foo: MyPrivateClass = new MyPrivateClass();
export class MyPublicClass {
someMethod(){
var bar = foo.prop1;
}
}
}
var x = new MyModule.MyPublicClass();
答案 2 :(得分:0)
嗯,我没有看到任何问题,但不要忘记初始化字段值,否则编译器将不会生成字段:
module MyModule {
class MyPrivateClass {
}
export class MyPublicClass {
private instance: MyPrivateClass; // MyPrivateClass is unknown
constructor() {
this.instance = new MyPrivateClass();
}
}
}
答案 3 :(得分:0)
你在一条评论中说过:
奇怪的是:如果我粘贴上面的代码(你的或我的),那很好。 但是只要我将模块的名称更改为其真实名称,就可以了 我描述的错误出现
这听起来与我遇到的问题非常相似。这是因为我一直在使用各种引用路径来导入模块。因此,模块内部成员无法互相访问。
我很抱歉,但我记不起任何更多细节,而且我无法重现您(或我)的错误。这可能没用,但我想我会分享我的经验:混合参考路径和模块似乎会导致非常奇怪的错误。
此外,有时VisualStudio表现得相当奇怪。我目前正和朋友一起制作打字稿项目。代码存储在github仓库中。我们都拉了相同的版本。我为我工作得很好,并为他撒上了错误信息。相同的操作系统,相同版本的Typescript,相同版本的VisualStudio,...有趣的是,错误也与模块有关。导入的模块似乎是“空的”。尝试使用此模块内容的所有代码都标记为红色。他重新启动了VisualStudio,突然之间,代码被认为是有效的。我们没有改变任何东西!它编译也没有问题。