一個(gè)對象是包含一組鍵值對集合的實(shí)例。值可以是標(biāo)量值或函數(shù),甚至是其他對象的數(shù)組。語法如下所示:
var object_name = { key1: “value1”, //scalar value key2: “value”, key3: function() { //functions }, key4:[“content1”, “content2”] //collection };
如上所示,一個(gè)對象可以包含標(biāo)量值,函數(shù)和結(jié)構(gòu)(如數(shù)組和元組)。
var person = { firstname:"Tom", lastname:"Hanks" }; //access the object values console.log(person.firstname) console.log(person.lastname)
在編譯時(shí),它會在JavaScript中生成相同的代碼。
上面的代碼的輸出如下:
Tom Hanks
比方說,你在JavaScript中創(chuàng)建了一個(gè)對象文本:
var person = { firstname:"Tom", lastname:"Hanks" };
如果您想為對象添加一些值,JavaScript允許你進(jìn)行必要的修改。假設(shè)我們需要在person對象中添加一個(gè)函數(shù),你可以使用以下的方法。
person.sayHello = function(){ return "hello";}
如果在TypeScript中使用相同的代碼,編譯器會給出錯誤。這是因?yàn)樵赥ypeScript中,具體對象應(yīng)具有類型模板。TypeScript中的對象必須是一個(gè)特定類型的實(shí)例。
您可以通過在聲明中使用方法模板來解決這個(gè)問題。
var person = { firstName:"Tom", lastName:"Hanks", sayHello:function() { } //Type template } person.sayHello = function() { console.log("hello "+person.firstName) } person.sayHello()
在編譯時(shí),它會在JavaScript中生成相同的代碼。
上面的代碼的輸出如下:
hello Tom
對象也可以作為參數(shù)傳遞給函數(shù)。
var person = { firstname:"Tom", lastname:"Hanks" }; var invokeperson = function(obj: { firstname:string, lastname :string }) { console.log("first name :"+obj.firstname) console.log("last name :"+obj.lastname) } invokeperson(person)
本示例聲明了一個(gè)對象文本。函數(shù)表達(dá)式是通過傳遞person對象來調(diào)用的。
在編譯時(shí),它會生成以下JavaScript代碼:
//Generated by typescript 1.8.10 var person = { firstname: "Tom", lastname: "Hanks" }; var invokeperson = function (obj) { console.log("first name :" + obj.firstname); console.log("last name :" + obj.lastname); }; invokeperson(person);
它的輸出如下:
first name :Tom last name :Hanks
您可以動態(tài)創(chuàng)建并傳遞一個(gè)匿名對象。
var invokeperson = function(obj:{ firstname:string, lastname :string}) { console.log("first name :"+obj.firstname) console.log("last name :"+obj.lastname) } invokeperson({firstname:"Sachin",lastname:"Tendulkar"});
在編譯時(shí),它會生成以下JavaScript代碼:
//Generated by typescript 1.8.10 var invokeperson = function (obj) { console.log("first name :" + obj.firstname); console.log("last name :" + obj.lastname); }; invokeperson({ firstname: "Sachin", lastname: "Tendulkar" }); invokeperson({ firstname: "Sachin", lastname: "Tendulkar" });
它的輸出如下:
first name :Sachin last name :Tendulkar
在鴨子類型(duck-typing)中,如果兩個(gè)對象共享同一組屬性,則認(rèn)為它們屬于同一類型。鴨子類型驗(yàn)證對象中某些屬性的存在,而不是它們的實(shí)際類型,以檢查它們的適用性。這個(gè)概念一般是可以由以下短語解釋:
“當(dāng)我看到一只像鴨子一樣散步,像鴨子一樣游動,像鴨子一樣呱呱叫的鳥兒時(shí),我稱這只鳥為鴨子?!?
TypeScript編譯器實(shí)現(xiàn)鴨子類型系統(tǒng),允許動態(tài)創(chuàng)建對象,同時(shí)保持類型安全。以下示例顯示了如何傳遞未顯式實(shí)現(xiàn)接口但包含函數(shù)所需的所有成員的對象。
interface IPoint { x:number y:number } function addPoints(p1:IPoint,p2:IPoint):IPoint { var x = p1.x + p2.x var y = p1.y + p2.y return {x:x,y:y} } //Valid var newPoint = addPoints({x:3,y:4},{x:5,y:1}) //Error var newPoint2 = addPoints({x:1},{x:4,y:3})
更多建議: