TypeScript - 物件



在 TypeScript 中,物件是一個包含一組鍵值對的例項。鍵值對也稱為物件屬性。值可以是標量值、函式,甚至其他物件的陣列。如果屬性的值是一個函式,則該屬性稱為方法。

語法

在 TypeScript 中建立物件的語法如下所示:

var object_name = { 
   key1: "value1", //scalar value 
   key2: "value",  
   key3: function() {
      //functions 
   }, 
   key4:[ "content1", "content2"] //collection  
};

如上所示,一個物件可以包含標量值、函式以及陣列和元組等結構。

型別註解

在 TypeScript 中,我們應該像下面這樣對物件屬性進行註解:

let person: {name: string, age: number} = {
   name: "Tom Hanks",
   age: 35,
}

在上面的示例中,我們對 person 物件的 nameage 屬性進行了註解。

我們還可以使用介面為物件屬性建立型別。請看下面的示例:

interface PersonType {
   fullname: string;
   age: number
}
var person: PersonType = { fullname:"Tom Hanks", age:32 };

物件字面量表示法

物件字面量表示法是在 TypeScript 中建立物件的簡便方法。我們使用花括號 ({}) 來建立物件。物件的每個屬性都用逗號分隔。每個屬性都寫成屬性名稱(鍵)後跟冒號 (:),再跟屬性值。

示例

在下面的示例中,我們建立了一個名為 person 的物件,它包含兩個屬性。第一個屬性是 firstname: "Tom",第二個屬性是 lastname: "Hanks"。我們訪問屬性值並在控制檯中列印它們。

var person:{ firstName: string, lastName: string}= { 
   firstName:"Tom", 
   lastName:"Hanks" 
}; 
//access the object values 
console.log(person.firstName) 
console.log(person.lastName)

編譯後,它將在 JavaScript 中生成以下程式碼。

var person = {
    firstName: "Tom",
    lastName: "Hanks"
};
//access the object values 
console.log(person.firstName);
console.log(person.lastName);

輸出

Tom 
Hanks

TypeScript 型別模板

假設你在 JavaScript 中建立了一個物件字面量,如下所示:

var person = { 
   firstname:"Tom", 
   lastname:"Hanks" 
};

如果你想向物件新增一些值,JavaScript 允許你進行必要的修改。假設我們稍後需要向 person 物件新增一個函式,這就是你可以執行此操作的方式。

person.sayHello = function(){ return "hello";}

如果你在 Typescript 中使用相同的程式碼,編譯器會報錯。這是因為在 Typescript 中,具體物件應該有一個型別模板。Typescript 中的物件必須是特定型別的例項。

你可以透過在宣告中使用方法模板來解決這個問題。

示例:Typescript 型別模板

var person = {
   firstName:"Tom", 
   lastName:"Hanks", 
   sayHello:function() {  }  //Type template 
} 
person.sayHello = function() {  
   console.log("hello "+person.firstName)
}  
person.sayHello()

編譯後,它將在 JavaScript 中生成相同的程式碼。

輸出

上面生成的 JavaScript 程式碼將產生以下輸出:

hello Tom

物件作為函式引數

物件也可以作為引數傳遞給函式。

示例:物件作為函式引數

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)

該示例聲明瞭一個物件字面量。函式表示式被呼叫,傳遞 person 物件。

編譯後,它將在 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

匿名物件

你可以動態建立和傳遞匿名物件。

示例:匿名物件

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"});

編譯後,它將在 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" });

輸出

first name :Sachin 
last name :Tendulkar

鴨子型別

在鴨子型別中,如果兩個物件共享相同的屬性集,則認為它們屬於相同的型別。鴨子型別驗證物件中是否存在某些屬性,而不是它們的實際型別,以檢查它們的適用性。這個概念通常用以下短語來解釋:

“當我看到一隻像鴨子一樣走路、像鴨子一樣游泳、像鴨子一樣嘎嘎叫的鳥時,我稱這隻鳥為鴨子。”

TypeScript 編譯器實現了鴨子型別系統,該系統允許動態建立物件,同時保持型別安全。以下示例顯示瞭如何將不顯式實現介面但包含所有必需成員的物件傳遞給函式。

示例

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})
廣告