12

看看下面的代码:

module MyModule {
    class MyPrivateClass {
        ...
    }

    export class MyPublicClass {
        private var: MyPrivateClass; // MyPrivateClass is unknown
    }
}

我希望MyPrivateClass仅在MyModule中可见,特别是在MyPublicClass内部使用。在MyModule之外,只有MyPublicClass应该是可见的。我认为上面的布局应该可以,但是 VS 抱怨MyPrivateClass在MyPublicClass中不可见。在MyPrivateClass的定义之前添加 export使其对MyPublicClass可见,但随后从外部也可见。

有没有办法让它只对MyPublicClass可见?

谢谢你。

4

4 回答 4

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
于 2012-10-12T16:32:08.747 回答
2

如果您希望它在发出的 JavaScript 中是私有的,您可以通过将私有 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();
于 2013-01-03T16:39:55.220 回答
0

嗯,我看不出有什么问题,但是别忘了初始化字段值,否则编译器不会生成字段:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
于 2012-10-08T12:40:26.217 回答
0

您在其中一条评论中说:

很奇怪:如果我粘贴上面的代码(你的或我的),那很好。但是一旦我将模块的名称更改为它的真实名称,就会出现我描述的错误

这听起来与我遇到的问题非常相似。这是因为我一直在使用各种引用路径来导入模块。结果模块内的成员不能互相访问。

对不起,我不记得更多细节了,我无法重现您(或我)的错误。这可能没用,但我想我还是会分享我的经验:混合引用路径和模块似乎会导致非常奇怪的错误。

此外,有时 VisualStudio 的行为相当奇怪。我目前正在和一个朋友一起做一个打字稿项目。代码存储在 github 存储库中。我们都提取了相同的版本。我为我工作得很好,并且为他撒了错误信息。相同的操作系统,相同版本的 Typescript,相同版本的 VisualStudio,......有趣的是,错误也与模块有关。导入的模块似乎是“空的”。所有试图使用该模块内容的代码都被标记为红色。他重新启动了 VisualStudio,突然间,代码被认为是有效的。我们没有改变任何东西!它编译也没有问题。

于 2013-01-19T12:15:53.093 回答