如果我不在foo
,loadBar
和text
之前添加私人,我相信他们公开默认值。
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;
}
由于
答案 0 :(得分:152)
在回答这个问题时有很多话要说,这些是我想到的第一个想法:
首先,请记住private
只是一个编译时构造 - 它不能在运行时强制执行(请参阅here和here进行相关讨论)。因此,请放弃private
出于安全目的以任何方式有用的任何概念。这根本不是它的意思。
关于封装,当你想在其中封装组件的字段或方法时,明确表示不应该从其他任何地方访问它,那么你绝对应该private
:这就是private
的用途:它标志着你的意图,无论你穿什么都不应该从课外接触。
同样适用于public
:它也是一个仅编译时的构造,因此默认情况下类成员为public
的事实虽然为true,但在运行时的含义恰好为零。但是当你有一个明确打算作为你的类API的一部分暴露给外部世界的成员时,你绝对应该让public
表示这个意图:这就是public
的用途。
这一般都适用于Typescript。特别是在Angular中,确实有公共成员使用组件类的有效用例:例如,在实现container/component(又名smart/dumb)模式时,“哑”孩子注入“聪明”父母通过构造函数注入,非常重要的是告诉您关于父母的成员应该和不应该被孩子接触的意图:否则,当你抓住那些在父母酒柜里鬼混的愚蠢孩子时,不要感到惊讶。 / p>
所以,我对你问题的回答:
我应该总是为所有人添加私人信息,如下所示吗?
强调否。你不应该总是添加private
,因为这样做会破坏关键字的目的,因为如果你把它放在任何地方它就不再发出任何意图:你可能不会把它放在一起任何地方。
答案 1 :(得分:12)
@drewmoore提供了一个很好的答案,私人/公共归结为意图。但是在使用注入的私有值时还需要考虑一些事项:
@Import() private foo
或constructor(private foo) {}
,并且仅使用foo
,则两种打字稿(noUnusedLocals)和tslint(no-unused-variable)都会报告错误模板如果我们想要发出TypeScript作为AoT编译过程的输出 我们必须确保只访问我们模板中的公共字段 部件**