
- TypeScript 基礎
- TypeScript - 首頁
- TypeScript - 路線圖
- TypeScript - 概述
- TypeScript - 環境設定
- TypeScript - 基本語法
- TypeScript 與 JavaScript
- TypeScript - 特性
- TypeScript - 變數
- TypeScript - let & const
- TypeScript - 運算子
- TypeScript 基本型別
- TypeScript - 型別
- TypeScript - 型別註解
- TypeScript - 型別推斷
- TypeScript - 數字
- TypeScript - 字串
- TypeScript - 布林值
- TypeScript - 陣列
- TypeScript - 元組
- TypeScript - 列舉
- TypeScript - Any
- TypeScript - Never
- TypeScript - 聯合型別
- TypeScript - 字面量型別
- TypeScript - 符號
- TypeScript - null 與 undefined
- TypeScript - 類型別名
- TypeScript 控制流
- TypeScript - 決策
- TypeScript - if 語句
- TypeScript - if else 語句
- TypeScript - 巢狀 if 語句
- TypeScript - switch 語句
- TypeScript - 迴圈
- TypeScript - for 迴圈
- TypeScript - while 迴圈
- TypeScript - do while 迴圈
- TypeScript 函式
- TypeScript - 函式
- TypeScript - 函式型別
- TypeScript - 可選引數
- TypeScript - 預設引數
- TypeScript - 匿名函式
- TypeScript - 函式構造器
- TypeScript - rest 引數
- TypeScript - 引數解構
- TypeScript - 箭頭函式
- TypeScript 介面
- TypeScript - 介面
- TypeScript - 擴充套件介面
- TypeScript 類和物件
- TypeScript - 類
- TypeScript - 物件
- TypeScript - 訪問修飾符
- TypeScript - 只讀屬性
- TypeScript - 繼承
- TypeScript - 靜態方法和屬性
- TypeScript - 抽象類
- TypeScript - 訪問器
- TypeScript - 鴨子型別
- TypeScript 高階型別
- TypeScript - 交叉型別
- TypeScript - 型別守衛
- TypeScript - 型別斷言
- TypeScript 型別操作
- TypeScript - 從型別建立型別
- TypeScript - Keyof 型別運算子
- TypeScript - Typeof 型別運算子
- TypeScript - 索引訪問型別
- TypeScript - 條件型別
- TypeScript - 對映型別
- TypeScript - 模板字面量型別
- TypeScript 泛型
- TypeScript - 泛型
- TypeScript - 泛型約束
- TypeScript - 泛型介面
- TypeScript - 泛型類
- TypeScript 雜項
- TypeScript - 三斜線指令
- TypeScript - 名稱空間
- TypeScript - 模組
- TypeScript - 環境宣告
- TypeScript - 裝飾器
- TypeScript - 型別相容性
- TypeScript - 日期物件
- TypeScript - 迭代器和生成器
- TypeScript - Mixins
- TypeScript - 實用程式型別
- TypeScript - 裝箱和拆箱
- TypeScript - tsconfig.json
- 從 JavaScript 到 TypeScript
- TypeScript 有用資源
- TypeScript - 快速指南
- TypeScript - 有用資源
- TypeScript - 討論
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 物件的 name 和 age 屬性進行了註解。
我們還可以使用介面為物件屬性建立型別。請看下面的示例:
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})