TypeScript 對象

2019-01-23 14:42 更新

一個(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

TypeScript類型模板

比方說,你在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è)問題。

示例:TypeScript類型模板

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ù)。

示例:對象作為函數(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)

鴨子類型(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})
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號