2016-09-14 195 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