2016-09-14 96 views
2

铸造文本对象我真的不知道什么时候使用:对象与在打字稿

interface IFoo 
{ 
    bar: string; 
} 

... 

let array: IFoo[]; 

array.push(<IFoo>{ bar: "test" }); 

或者

class Foo 
{ 
    bar: string; 
} 

... 

let array: Foo[]; 
let obj = new Foo(); 

obj.bar = "test"; 

array.push(obj); 

THS的事情是,我是从C#世界和未来我做第二种方法比较干净,但第一种方式也很诱人,尽管它没有第二种方法那样严格。因此,现在我真的很挣扎,我只是觉得我可以使用我想要的,但我很确定他们都有优点和缺点。不幸的是,我在谷歌上找不到任何东西。

感谢

+0

你为什么在第一个例子中投射?这是不必要的 –

+0

这的确是这样,但问题仍然有效;-) – ssougnez

+2

如果你只是想拥有一个带有属性的对象,那么去接口的第一个选项,但如果你想拥有该对象的方法,那么去一个类 –

回答

2

在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 }可使用任一interfacetype语法

type Ta = { b : string } //or 
interface Ta { b : string } 
var a : Ta 

声明类型的注释(包括接口)添加零码到混凝土JS境界被引用了。

..on另一方面,当您使用class,打字稿既创造

  • 具体JS代码(即原型对象)
  • 也是一对夫妇类型的境界居民。

TL; DR:

我们答案,有任何的2种方式没有什么大问题,但使用接口(和更少班)向最常见的JavaScript编码风格倾斜。有些JS学校主张反对课程的使用,因为你可以通过其他模式获得相同的效果。

+0

好的,所以当我需要包含方法和普通对象的高级对象时,有效的方法是使用类,而不是这种情况?感谢您的解释:-P – ssougnez

+1

大多是这样的。越简单越好。 –

+0

很酷,非常感谢;-) – ssougnez

0

我认为这两个例子会失败,因为你没有初始化的array价值,只是声明一个类型吧。你需要初始化它是这样的:

let array : Array<IFoo> = []; 
array.push({bar: "test" }); 

使用类的好处不会成为显著,直到你定义一些其他成员也一样,方法或计算的性能。在这种情况下,您会想要使用new Foo(...)

+0

有关更多详细信息,请参阅http://stackoverflow.com/questions/12764247/typescript-interface-vs-class-vs-modules-vs-program-vs-function –

+0

的确,我忘了初始化。这是因为我直接键入代码并没有测试它;-) – ssougnez