【TypeScript】02 面向物件
阿新 • • 發佈:2020-07-28
【聯合型別】
聯合型別(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 )