在Typescript中,Javascript“prototype”的替代等价物是什么?

时间:2018-06-13 06:09:33

标签: javascript typescript prototype prototypal-inheritance equivalent

Typescript提供面向对象的&除了Javascript提供的函数编程之外的通用编程范例。

关键字prototype是一个非常强大且有时是危险的工具。一般来说,我读到它模拟了Javascript中的继承方面。

那么最好是.ts中prototype的[最接近]替代方案是什么?

1 个答案:

答案 0 :(得分:3)

  

Typescript提供面向对象的&除了Javascript提供的函数编程之外的通用编程范例。

不,JavaScript本身提供了面向对象的通用编程模型,并且也可以用于函数式编程风格(但并不是专门为支持它而设计的,如Haskell)。

所有TypeScript都是:

  • 添加静态类型检查(这是它的主要目的)。
  • 支持通过TypeScript编译器尽早采用某些即将推出的JavaScript功能(例如:TypeScript的编译器支持class语法很早就开始了。)
  • 在构造函数上添加一些额外的语法,这些语法不太可能成为JavaScript特性:自动将参数复制到属性。
  • 通过private关键字添加“私人”属性; JavaScript很快就会拥有私有属性,但不会使用TypeScript使用的语法。

其他一切都是JavaScript。

当我说“全部”时,那并不是要减少那些东西。特别是静态类型检查非常有用,特别是在大型项目中。

  

关键字prototype是一个非常强大且有时是危险的工具。一般来说,我读到它模拟了Javascript中的继承方面。

prototype不是关键字,它只是构造函数上属性的名称,它引用的对象将被指定为使用new关键字创建的对象的原型。构造

JavaScript中的继承不是模拟。使用原型实现,请参阅prototypical inheritance

  

那么最好是.ts中prototype的[最接近]替代方案是什么?

那将是:prototype,明确地或间接地通过class。同样,TypeScript只是添加了一层静态类型检查和一些次要的语法添加。其他一切都只是JavaScript。

  

假设答案是继承,那么extend如何将implement JS的接口转换为TS [因为可能有很多抽象方法]?

你在这里要问的不是很清楚。您可以扩展字符串:

class MyString extends String {
    // ...
}

...或添加到String.prototype,最好通过Object.defineProperty添加分配给它们的函数的非可枚举属性:

Object.defineProperty(String.prototype, "myAddition", {/*...*/});