请考虑以下代码:
export class Hero {
constructor(private id: number, private name: string) {}
}
@Component({
selector: 'my-app',
template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
export class AppComponent {
private title = "Tour of Heroes";
private hero: Hero = new Hero(1, "Windstorm");
}然而,在AppComponent的模板中,我编写了hero.name,但是根据Hero类,这个字段是私有的,不应该被访问。这段代码是如何编译和工作的?我是不是遗漏了什么?
编辑:阅读了关于为什么会发生这种情况的答案,这是我的处理方法,它不是一个修复,但它保持了更有组织和安全的,而且访问器总是很适合使用:
export class Hero {
constructor(private _id: number, private _name: string) { }
get name(): string {
return this._name;
}
get id(): number {
return this._id;
}
}
@Component({
selector: 'my-app',
template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
export class AppComponent {
private title = "Tour of Heroes";
private hero: Hero = new Hero(1, "Windstorm");
}当hero.name在JS中执行时,它应该调用您在TS代码中定义的JS编译的getter函数,这将在保持TS代码风格的同时对属性提供某种控制。
发布于 2016-07-19 20:51:09
在JavaScript中,没有私有变量这样的东西。像private这样的关键字只是被TypeScript转换程序使用来强制执行转换溢出之前的约束。一旦代码被转换到JavasScript中,name属性就是Hero类的可见成员。
发布于 2016-07-19 20:51:56
类型记录中的private关键字仅用于编译时检查,实际上并不限制运行时对任何内容的访问。类型记录编译器没有检查模板,所以没有发现问题。
我相信一些IDE (VS代码和WebStorm)正在对模板进行类型检查,但目前您是自己开发的。
发布于 2017-03-23 07:56:32
Angular2声明引用模板中的私有变量作为一种正确的方法。见备忘单:https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter。
那就去吧!并启用对组件的封装,而不是将每个变量公开为公共变量。
https://stackoverflow.com/questions/38468227
复制相似问题