Angular 2组件中的“private”和“public”
如果我不在foo
, loadBar
和text
之前添加私有 ,我相信它们是默认公开的。
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 foo
或constructor(private foo) {}
,则typecript( noUnusedLocals )和tslint( no-unused-variable )将报告错误,并且仅在模板中使用foo
- AOT不会工作 :
如果我们想发出TypeScript作为AoT编译过程的输出,我们必须确保我们只访问组件模板中的公共字段**
- 这被认为是反模式
- npm @types org包中的TypeScripttypes
- 无法绑定到“formControl”,因为它不是“input”的已知属性 – angular2材料自动完成问题
- 在Typescript中创build一个AngularJS 1.5组件的最佳实践是什么?
- 声明并初始化打字稿中的字典
- 我如何select组件模板中的元素?
- Typescript:接口与types
- TypeScript与KnockoutJS
- rxjs / Subject.d.ts错误:Class'Subject <T>'错误地扩展了基类'Observable <T>'
- 如何在Visual Studio 2015中启用TypeScript文件的预览面板?