TypeScript:使类仅在模块内可见

时间:2012-10-08 12:28:30

标签: typescript

查看以下代码:

module MyModule {
    class MyPrivateClass {
        ...
    }

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

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

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

谢谢。

4 个答案:

答案 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,突然之间,代码被认为是有效的。我们没有改变任何东西!它编译也没有问题。