TypeScript私人成员
我正在寻找在TypeScript中实现私有成员,我觉得有点混乱。 Intellisense不允许访问私有成员,但在纯JavaScript中,它就在那里。 这使我认为TS没有正确实现私有成员。 有什么想法吗?
class Test{ private member: any = "private member"; } alert(new Test().member);
就像types检查一样,成员的隐私只在编译器中执行。
一个私有财产是作为一个普通财产实现的,而且这个类之外的代码是不允许访问它的。
为了在类中创build一个真正私有的东西,它不能是类的成员,它将是创build对象的代码中的一个函数范围内创build的局部variables。 这意味着你不能像访问类的成员那样访问它,即使用this
关键字。
JavaScript确实支持私有variables。
function MyClass() { var myPrivateVar = 3; this.doSomething = function() { return myPrivateVar++; } }
在TypeScript中,这将expression如下:
class MyClass { doSomething: () => number; constructor() { var myPrivateVar = 3; this.doSomething = function () { return myPrivateVar++; } } }
编辑
这种方法只能用在绝对需要的地方。 例如,如果您需要暂时caching密码。
使用这种模式(与Javascript或Typescript不相关)有性能成本,只能在绝对必要的情况下使用。
一旦对WeakMap的支持更加广泛的可用,在这里的例子#3中有一个有趣的技术。
它允许私人数据和避免贾森·埃文斯例子的性能成本,通过允许从原型方法而不是仅仅实例方法访问数据。
链接的MDN WeakMap页面列出了Chrome 36,Firefox 6.0,IE 11,Opera 23和Safari 7.1的浏览器支持。
let _counter = new WeakMap(); let _action = new WeakMap(); class Countdown { constructor(counter, action) { _counter.set(this, counter); _action.set(this, action); } decrement() { let counter = _counter.get(this); if (counter < 1) return; counter--; _counter.set(this, counter); if (counter === 0) { _action.get(this)(); } } }
在TypeScript中私有函数只能在类中访问。 喜欢
当您尝试访问私人成员时,它会显示错误。 这是一个例子:
注意:这将是好的JavaScript和两个function都可以访问以外。
感谢Sean Feldman提供的关于这个问题的正式讨论的链接 – 请参阅他对这个链接的回答 。
我读了他所讨论的讨论, 这里是关键点的总结:
- build议:构造函数中的私有属性
- 问题:不能从原型函数访问
- build议:构造函数中的私有方法
- 问题:与属性相同,再加上在原型中每个类创build一个函数失去性能优势; 而是为每个实例创build一个函数的副本
- build议:添加样板来抽象属性访问并强制显示
- 问题:主要的性能开销; TypeScript是为大型应用程序devise的
- build议: TypeScript已经将构造函数和原型方法定义封装在闭包中; 把私人的方法和财产放在那里
- 将私有财产置于封闭的问题:它们成为静态variables; 每个实例都没有一个
- closures私有方法的问题:如果没有某种解决方法,他们就无法访问
this
- build议:自动修改私有variables名称
- 反指称:这是一个命名约定,而不是语言结构。 你自己来处理
- build议:使用
@private
注释私有方法,以便识别注释的缩小器可以有效地缩小方法名称- 没有重要的反驳这个
在发出的代码中添加可视性支持的总体反驳:
- 问题是JavaScript本身没有可见性修饰符 – 这不是TypeScript的问题
- JavaScript社区中已经有了一个既定的模式:前缀私有属性和带有下划线的方法,它表示“自行承担风险”
- 当TypeScriptdevise师说真正的私有属性和方法不是“可能的”时,他们的意思是“在我们的devise约束下不可能”,具体来说:
- 发射的JS是惯用的
- 锅板是最小的
- 与普通的JS OOP相比没有额外的开销
许多人声称这是不可能的,因为JavaScript的限制。 我会说这是JavaScript开发人员的创造力的限制。
我现在正在开发一个库,允许私有和受保护的可inheritance类的成员,以及称为ClassJS的接口等。 在GitHub上查看。