Angular组件中的"私有"和"公共"

Hon*_*iao 103 typescript angular

如果我不加私人之前foo,loadBartext,我相信他们是公共默认情况下.

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}
Run Code Online (Sandbox Code Playgroud)

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

出于封装/安全原因,我是否应该private像以下一样为所有这些添加?

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

谢谢

dre*_*ore 182

回答这个问题有很多话要说,这些是我脑子里想到的第一个想法:

首先,请记住,这private只是一个编译时构造 - 它不能在运行时强制执行(请参阅此处此处进行相关讨论).因此,请private为了安全目的而废除任何有用的概念.这根本不是它的意思.

关于封装的,当您在组件上有一个要封装在其中的字段或方法时,明确表示不应该从其他任何地方访问它,那么您应该绝对做到private:这private就是:它标志着你的意图,无论你穿什么都不应该从课外接触.

同样的情况public:它也是一个仅编译时的构造,因此public默认情况下类成员的事实是真的,在运行时具有完全零意义.但是当你有一个明确打算作为你的类API的一部分暴露给外部世界的成员时,你绝对应该让它public表明这个意图:这public就是为了什么.

这一般都适用于Typescript.特别是在Angular中,确实有公共成员使用组件类的有效用例:例如,在实现容器/组件(又称智能/哑)模式时,"哑"子项通过构造函数注入注入"智能"父项,非常重要的是要传达你对父母应该和不应该被孩子们触摸的意图的意图:否则,当你抓住那些在父母酒柜里鬼混的愚蠢孩子时,不要感到惊讶.

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

我应该像以下一样为所有人添加私人吗?

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

  • 感谢您的解释.但也许我弄错了:我明白大多数时候属性和方法都必须是私有的(="仅用于此组件").所以答案应该是"默认为YES,只要该人不需要将属性/方法暴露给外部".不是吗?为什么通过回答"否"(听起来像"从不")来结束你的解释? (3认同)

Luc*_*cas 17

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

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