角度分量中的“私有”和“公有”

如果我没有在 fooloadBartext之前添加 二等兵,我相信它们默认是 公众人士

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

当它们在组件中是 public时,是否有任何用例?

出于封装/安全方面的考虑,我是否应该像下面这样总是添加 private

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

谢谢

118529 次浏览

对于这个问题,我有很多话要说,以下是我首先想到的:

首先,请记住,private只是一个编译时构造——它不能在运行时强制执行(请参阅 给你给你的相关讨论) : 出于安全目的,请摒弃 private在任何方面都有用的任何概念。根本不是这么回事。

它是关于封装的 ,当你有一个字段或方法在你的组件上,你想要封装它,明确它不应该从任何其他地方访问,那么你绝对应该使它成为 private: 这就是 private的用途: 这表明了你的意图,无论你把它放在什么地方,都不应该从类的外部触及。

对于 public也是一样: 它也是一个仅编译时的构造,所以类成员默认为 public,而在运行时则为 true,这一事实没有任何意义。但是,当您有一个成员,您显式打算公开给外部世界作为您的类的 API 的一部分,您绝对应该使它 public信号这个意图: 这就是 public的用途。

这通常都适用于 Typecript。具体来说,在组件类中拥有公共成员绝对是有效的用例: 例如,当实现 容器/组件(又名 聪明又愚蠢)模式时,“哑巴”孩子通过构造函数注入注入“聪明”父母,这是非常重要的传达你的意图,父母上的什么成员应该和不应该被孩子触摸: 否则,当你发现那些愚蠢的孩子在他们父母的酒柜里鬼混时,不要感到惊讶。

那么,我来回答你的问题:

我应该总是为他们添加私有的,如下面?

是一个强调的 没有。你不应该 一直都是添加 private,因为这样做会破坏关键字的目的,因为如果你把它放在任何地方,它不再表明任何意图: 你可能也不会把它放在任何地方。

@ drewmoore 提供了一个很好的答案,归结起来就是意图。但是,在使用注入的私有值时,还有一些事情需要考虑:

如果我们希望发出 TypeScript 作为 AoT 编译过程的输出 我们必须确保只访问 组件