中文網:https://www.tslang.cn/html
目錄:typescript
接口的做用:在面向對象的編程中,接口是一種規範的定義,它定義了行爲和動做的規範,在程序設計裏面,接口起到一種限制和規範的做用。接口定義了某一批類所須要遵照的規範,接口不關心這些類的內部狀態數據,也不關心這些類裏方法的實現細節,它只規定這批類裏必須提供某些方法,提供這些方法的類就能夠知足實際須要。編程
Typescrip 中的接口相似於 java,同時還增長了更靈活的接口類型,包括屬性、函數、可索引和類等。數組
定義標準。函數
對 對象屬性 的約束。學習
ts 中屬性對象傳參,對方法傳入的對象及屬性進行約束。this
function printLabel (label: {label:string}):void { console.log(`print label:${label.label}`); } printLabel({label: '標籤'}); // 必須傳入帶有label屬性,且屬性值是字符串的對象 // printLabel({label: '標籤', name: 'text'}); // 錯誤 // printLabel({name: '標籤'}); // 錯誤 // printLabel('標籤'); // 錯誤
接口:行爲和動做的規範,對批量方法傳入參數進行約束。加密
用關鍵字interface
定義,用分號結束。約定接口名首字母大寫。設計
interface FullName { firstName:string; // 注意,用分號結束 secondName:string; } function printName (name:FullName):void { // 必須傳入對象,且帶有屬性:firstName,secondName,且屬性值都是字符串 console.log(`${name.firstName} -- ${name.secondName}`); } printName({firstName:'張', secondName: '三'}); // 必須帶有 firstName,secondName // printName({firstName:'張', secondName: '三', name: '張三'}); // 錯誤 只能帶有 firstName,secondName const nameObj = {firstName:'張', secondName: '三', name: '張三', age: 20}; printName(nameObj); // 正確,這種方式,能夠傳額外的,可是 firstName、secondName 必須有 printName({ // 參數的順序能夠不同 secondName: '四', firstName: '李' }) function getName (name:FullName):string { return `${name.firstName} -- ${name.secondName}`; } getName({firstName:'張', secondName: '三'});
接口,可選屬性
interface FullName { firstName:string; secondName?:string; // ? 表明可選 } printName({firstName:'張'});
對方法傳入的參數以及返回值進行約束,批量約束。
interface Encrytp { (key:string, val:string):string; } let md5:Encrytp = function (key:string, val:string):string { // 具體加密省略 return key + val; } console.log(md5('name', 'Jane')); // nameJane let hash:Encrytp = function (key:string, val:string):string { // 具體加密省略 return key + ' ---- ' + val; } console.log(hash('name', 'Jane')); // name ---- Jane
對數組、對象的約束(不經常使用)
ts 中數組的兩種定義方式:
let arr1:Array<number> = [1, 2]; let arr2:string[] = ['12', '23'];
ts 中可索引接口,對數組的約束
interface userArr { [index:number]:string; } let arr3:userArr = ['a', 'b']; console.log(arr3[0]); // let arr4:userArr = [12, 34]; // 錯誤
ts 中可索引接口,對對象的約束
interface userObj { [index:string]:string; } let obj1:userObj = {name: 'Jane'}; // let obj2:userObj = {age: 12}; // 錯誤
對類的約束,和抽象類有點類似。類類型接口實現用關鍵字implements
interface Animal { name:string; eat (food:string):void; } class Dog implements Animal { // 類類型接口實現用關鍵字 implements name:string; constructor (name:string) { this.name = name; } eat (food:string):void { console.log(`${this.name}喜歡吃${food}`); } } let d = new Dog('小黑'); d.eat('骨頭'); // 小黑喜歡吃骨頭 class Cat implements Animal { name:string; constructor (name:string) { this.name = name; } eat (food:string):void { console.log(`${this.name}喜歡吃${food}`); } } let c = new Cat('小白'); c.eat('老鼠'); // 小白喜歡吃老鼠
接口能夠繼承接口
interface Animal { eat ():void; } interface Person extends Animal { work ():void; } class Web implements Person { name:string; constructor (name:string) { this.name = name; } // 接口 Animal 中的方法必須實現 eat ():void { console.log(`${this.name}喜歡吃甜點`); } // 接口 Person 中的方法必須實現 work ():void { console.log(`${this.name}在運動`); } } let w = new Web('小李'); w.eat(); w.work();
繼承類並實現接口
interface Animal { eat ():void; } interface Person extends Animal { work ():void; } class Programmer { name:string; constructor (name:string) { this.name = name; } coding () { console.log(`${this.name}在寫代碼`); } } class Web extends Programmer implements Person { constructor (name:string) { super(name); } // 接口 Animal 中的方法必須實現 eat ():void { console.log(`${this.name}喜歡吃甜點`); } // 接口 Person 中的方法必須實現 work ():void { console.log(`${this.name}在運動`); } } let w = new Web('小李'); w.eat(); w.work(); w.coding(); // 小李在寫代碼