TypeScript 物件
物件是包含一組鍵值對的例項。 值可以是標量、函式、陣列、物件等,如下例項:
var object_name = {
key1: "value1", // 標量
key2: "value",
key3: function() {
// 函式
},
key4:["content1", "content2"] //集合
}
以上物件包含了標量,函式,集合(陣列或元組)。
物件例項
TypeScript
var sites = {
site1:"itread01",
site2:"Google"
};
// 訪問物件的值
console.log(sites.site1)
console.log(sites.site2)
編譯以上程式碼,得到以下 JavaScript 程式碼:
JavaScript
var sites = {
site1:"itread01",
site2:"Google"
};
// 訪問物件的值
console.log(sites.site1)
console.log(sites.site2)
輸出結果為:
itread01 Google
TypeScript 型別模板
假如我們在 JavaScript 定義了一個物件:
var sites = {
site1:"itread01",
site2:"Google"
};
這時如果我們想在物件中新增方法,可以做以下修改:
sites.sayHello = function(){ return "hello";}
如果在 TypeScript 中使用以上方式則會出現編譯錯誤,因為Typescript 中的物件必須是特定型別的例項。
TypeScript
var sites = {
site1: "itread01",
site2: "Google",
sayHello: function () { } // 型別模板
};
sites.sayHello = function () {
console.log("hello " + sites.site1);
};
sites.sayHello();
編譯以上程式碼,得到以下 JavaScript 程式碼:
JavaScript
var sites = {
site1: "itread01",
site2: "Google",
sayHello: function () { } // 型別模板
};
sites.sayHello = function () {
console.log("hello " + sites.site1);
};
sites.sayHello();
輸出結果為:
hello itread01
此外物件也可以作為一個引數傳遞給函式,如下例項:
TypeScript
var sites = {
site1:"itread01",
site2:"Google",
};
var invokesites = function(obj: { site1:string, site2 :string }) {
console.log("site1 :"+obj.site1)
console.log("site2 :"+obj.site2)
}
invokesites(sites)
編譯以上程式碼,得到以下 JavaScript 程式碼:
JavaScript
var sites = {
site1: "itread01",
site2: "Google"
};
var invokesites = function (obj) {
console.log("site1 :" + obj.site1);
console.log("site2 :" + obj.site2);
};
invokesites(sites);
輸出結果為:
site1 :itread01 site2 :Google
鴨子型別(Duck Typing)
鴨子型別(英語:duck typing)是動態型別的一種風格,是多型(polymorphism)的一種形式。
在這種風格中,一個物件有效的語義,不是由繼承自特定的類或實現特定的介面,而是由"當前方法和屬性的集合"決定。
可以這樣表述:
"當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。"
在鴨子型別中,關注點在於物件的行為,能作什麼;而不是關注物件所屬的型別。例如,在不使用鴨子型別的語言中,我們可以編寫一個函式,它接受一個型別為"鴨子"的物件,並呼叫它的"走"和"叫"方法。在使用鴨子型別的語言中,這樣的一個函式可以接受一個任意型別的物件,並呼叫它的"走"和"叫"方法。如果這些需要被呼叫的方法不存在,那麼將引發一個執行時錯誤。任何擁有這樣的正確的"走"和"叫"方法的物件都可被函式接受的這種行為引出了以上表述,這種決定型別的方式因此得名。
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}
}
// 正確
var newPoint = addPoints({x:3,y:4},{x:5,y:1})
// 錯誤
var newPoint2 = addPoints({x:1},{x:4,y:3})