在javascript中,我们实际上没有类,但只有普通对象*(“哈希表”-y)具有原型功能。函数是某种对象(在它上面有一点糖语法)。
*(非学术正确地说,和隐藏一些东西)
试试下面的例子浏览器的调试器内,做一些检查
var parent = {
method1: function() { return 1 } ,
method2: function() { return 2 }
}
var child = Object.create(parent)
child.method2 = function() { return '2a' }
child.__proto__ //shows parent
parent.__proto__ //shows Object (the "root class")
child.method3() //undefined is not a function
child.method2() //2a, not 2
child.method1() //method1 not found, looks at __proto__, returns 1
child.toString
//looks at child, not found
//looks at child.__proto__ (parent), not found
//looks at child.__proto__.__proto__ (Object), returns function
一下班(从ES2015和transpilers)大致做的是从对象和原型开始,为了从其他语言获得class
行为/编程风格,您需要编写一些胶水代码。
在ES2015中,类声明创建一个“原型”对象,new
(或Object.create **)创建一个继承该原型的“实例”对象。
现在回到打字稿...
var a : { b : string }
a.b = '4'
{ b : string }
只是一个注解。它进入了类型的领域。假设在打字稿中,我们有2个领域,即具体变量的领域,这些领域结束于生成的代码中;和类型的领域,这些领域完全用于援助/短缺,但不会落在真正的JS中。 { b : string }
可使用任一interface
或type
语法
type Ta = { b : string } //or
interface Ta { b : string }
var a : Ta
声明类型的注释(包括接口)添加零码到混凝土JS境界被引用了。
..on另一方面,当您使用class
,打字稿既创造
- 具体JS代码(即原型对象)
- 也是一对夫妇类型的境界居民。
TL; DR:
我们答案,有任何的2种方式没有什么大问题,但使用接口(和更少班)向最常见的JavaScript编码风格倾斜。有些JS学校主张反对课程的使用,因为你可以通过其他模式获得相同的效果。
你为什么在第一个例子中投射?这是不必要的 –
这的确是这样,但问题仍然有效;-) – ssougnez
如果你只是想拥有一个带有属性的对象,那么去接口的第一个选项,但如果你想拥有该对象的方法,那么去一个类 –