1. 程式人生 > 實用技巧 >【TypeScript】02 面向物件

【TypeScript】02 面向物件

【聯合型別】

聯合型別(Union Types)可以通過管道(|)將變數設定多種型別,賦值時可以根據設定的型別來賦值。

注意:只能賦值指定的型別,如果賦值其它型別就會報錯。

var val:string|number 
val = 12 
console.log("數字為 "+ val) 
val = "Runoob" 
console.log("字串為 " + val)

可以將聯合型別作為函式引數使用:

function disp(name:string|string[]) { 
        if(typeof name == "string") { 
                console.log(name) 
        } 
else { var i; for(i = 0;i<name.length;i++) { console.log(name[i]) } } } disp("Runoob") console.log("輸出陣列....") disp(["Runoob","Google","Taobao","Facebook"])

可以將陣列宣告為聯合型別:

var arr:number[]|string[]; 
var i:number; 
arr 
= [1,2,4] console.log("**數字陣列**") for(i = 0;i<arr.length;i++) { console.log(arr[i]) } arr = ["Runoob","Google","Taobao"] console.log("**字串陣列**") for(i = 0;i<arr.length;i++) { console.log(arr[i]) }

【TypeScript介面】

interface interface_name { 
}

介面的方法即抽象方法,只有宣告而沒有具體實現:

但是屬性還是一樣的只有宣告

介面被描述成一種型別,這裡是由我們的變數對介面進行實現

interface IPerson { 
    firstName:string, 
    lastName:string, 
    sayHi: ()=>string 
} 
 
var customer:IPerson = { 
    firstName:"Tom",
    lastName:"Hanks", 
    sayHi: ():string =>{return "Hi there"} 
} 
 
console.log("Customer 物件 ") 
console.log(customer.firstName) 
console.log(customer.lastName) 
console.log(customer.sayHi())  
 
var employee:IPerson = { 
    firstName:"Jim",
    lastName:"Blakes", 
    sayHi: ():string =>{return "Hello!!!"} 
} 
 
console.log("Employee  物件 ") 
console.log(employee.firstName) 
console.log(employee.lastName)

【聯合型別和介面】

interface RunOptions { 
    program:string; 
    commandline:string[]|string|(()=>string); 
} 
 
// commandline 是字串
var options:RunOptions = {program:"test1",commandline:"Hello"}; 
console.log(options.commandline)  
 
// commandline 是字串陣列
options = {program:"test1",commandline:["Hello","World"]}; 
console.log(options.commandline[0]); 
console.log(options.commandline[1]);  
 
// commandline 是一個函式表示式
options = {program:"test1",commandline:()=>{return "**Hello World**";}}; 
 
var fn:any = options.commandline; 
console.log(fn());

【介面和陣列】

interface namelist { 
   [index:number]:string 
} 
 
var list2:namelist = ["John",1,"Bran"] / 錯誤元素 1 不是 string 型別
interface ages { 
   [index:string]:number 
} 
 
var agelist:ages; 
agelist["John"] = 15   // 正確 
agelist[2] = "nine"   // 錯誤

【介面多繼承】

TypeScript和我們的Java介面一樣允許多繼承:

interface IParent1 { 
    v1:number 
} 
 
interface IParent2 { 
    v2:number 
} 
 
interface Child extends IParent1, IParent2 { } 
var Iobj:Child = { v1:12, v2:23} 
console.log("value 1: "+Iobj.v1+" value 2: "+Iobj.v2)

【TypeScript 類】

class Car { 
    // 欄位 
    engine:string; 
 
    // 建構函式 
    constructor(engine:string) { 
        this.engine = engine 
    }  
 
    // 方法 
    disp():void { 
        console.log("發動機為 :   "+this.engine) 
    } 
}

建立例項:

var obj = new Car("Engine 1")

同Java一樣,TypeScript不支援類的多繼承,也是一樣的多重繼承:

class Root { 
   str:string; 
} 
 
class Child extends Root {} 
class Leaf extends Child {} // 多重繼承,繼承了 Child 和 Root 類
 
var obj = new Leaf(); 
obj.str ="hello" 
console.log(obj.str)

方法的重寫:

class PrinterClass { 
   doPrint():void {
      console.log("父類的 doPrint() 方法。") 
   } 
} 
 
class StringPrinter extends PrinterClass { 
   doPrint():void { 
      super.doPrint() // 呼叫父類的函式
      console.log("子類的 doPrint()方法。")
   } 
}

Static靜態,類的變數

class StaticMem {  
   static num:number; 
   
   static disp():void { 
      console.log("num 值為 "+ StaticMem.num) 
   } 
} 
 
StaticMem.num = 12     // 初始化靜態變數
StaticMem.disp()       // 呼叫靜態方法

instanceof運算

var Person = /** @class */ (function () {
    function Person() {
    }
    return Person;
}());
var obj = new Person();
var isPerson = obj instanceof Person;
console.log(" obj 物件是 Person 類例項化來的嗎? " + isPerson);

就連訪問修飾符也是一樣。。。

private
protected
public
  • public(預設): 公有,可以在任何地方被訪問。

  • protected: 受保護,可以被其自身以及其子類和父類訪問。

  • private: 私有,只能被其定義所在的類訪問。

類實現介面也是一樣使用implements:

interface ILoan { 
   interest:number 
} 
 
class AgriLoan implements ILoan { 
   interest:number 
   rebate:number 
   
   constructor(interest:number,rebate:number) { 
      this.interest = interest 
      this.rebate = rebate 
   } 
} 
 
var obj = new AgriLoan(10,1) 
console.log("利潤為 : "+obj.interest+",抽成為 : "+obj.rebate )