Angular 2组件中的“private”和“public”

如果我不在fooloadBartext之前添加私有 ,我相信它们是默认公开的。

 export class RandomComponent { @Input() foo: string; @Output() loadBar = new EventEmitter(); text: string; } 

在组件中是否有任何用例?

为了封装/安全的原因,我应该总是添加像下面所有的private

 export class RandomComponent { @Input() private foo: string; @Output() private loadBar = new EventEmitter(); private text: string; } 

谢谢

回答这个问题还有很多要说的,这是我头脑中想到的第一个想法:

首先要记住的是, private只是一个编译时的构造 – 它不能在运行时强制执行(参见这里和这里的相关讨论)。 因此,请以任何方式为安全目的解除private有用的概念。 这根本就不是这样。

关于封装的,当你想要在你的组件中封装一个字段或方法时,明确表示不应该从其他地方访问它,那么你应该绝对private :这就是private的因为: 它表明你的意图不pipe你从事的是什么,都不应该从课外触及。

对于public也是一样:它也是一个只有编译时间的构造,因此,类成员默认是public的,而在运行时,它的含义是零。 但是当你有一个你明确打算把外部世界作为你的类的API的一部分公开的成员时,你应该绝对public地表示这个意图:这就是public意图。

这一切都适用于打字稿。 在Angular中,对于有组件类的公共成员有明确的有效用例:例如,在实现容器/组件 (aka smart / dumb )模式时,通过构造函数注入来向“聪明”传达你的意愿是非常重要的,要告诉孩子什么成员应该也应该不要被孩子感动:否则,当你在父母的酒柜里捉弄那些愚蠢的孩子时,不要惊讶。

所以,我回答你的问题:

我是否应该像下面一样为所有人添加私密性?

是一个强调没有 。 你不应该总是添加private因为这样做可以击败关键字的目的,因为如果你把它放在任何地方,它都不会有任何意图:你可能不会把它放在任何地方。

@drewmoore提供了一个很好的答案,私人/公众归结为意图。 但是在使用注入的私有值时还有几点需要考虑:

  • 如果您使用@Import() private fooconstructor(private foo) {} ,则typecript( noUnusedLocals )和tslint( no-unused-variable )将报告错误,并且仅在模板中使用foo
  • AOT不会工作 :

如果我们想发出TypeScript作为AoT编译过程的输出,我们必须确保我们只访问组件模板中的公共字段**

  • 这被认为是反模式