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上查看。