前言:ts定義接口的任意一個屬性
interface IPerson { name: string age: number family?: any[] // Error,因為不是任意類型的子集 [propName: string]: string | number // 一般設置 any,因為其他類型必需是任意類型的子集 [propName: string]: any // 一個 interface 中任意屬性只能有一個 }
ts中接口,接口是代碼的一種規范、約束和規定,ts中接口可分為以下幾類:
- 對象型接口 :對對象的規范
- 函數型接口 :對函數的規范
- 可索引(數組型)接口:對數組(or對象)的規范
- 類類型接口: 對類的規范
- 其他接口:泛型接口、繼承接口的接口 等
1. 對象型接口
1 interface Fullname { 2 firstName: string; 3 secondName: string; 4 flag?: boolean; 5 } 6 function printName({firstName, secondName, flag}: Fullname) { //解構 objName: Fullname 7 console.log(firstName); 8 console.log(secondName); 9 if(flag){} 10 } 11 printName({ firstName: "shun", secondName: "ershun" });
案例:用對象型接口封裝原生ajax請求
1 interface Config{ 2 type:string; //get post 3 url:string; 4 data?:string;//可選傳入 5 dataType:string;//json xml等 6 } 7 8 //原生js封裝的ajax 9 function ajax(config:Config){ 10 11 var xhr=new XMLHttpRequest(); 12 xhr.open(config.type,config.url,true); 13 14 if(config.data){ 15 xhr.send(config.data); 16 }else{ 17 xhr.send(); 18 } 19 20 xhr.onreadystatechange=function(){ 21 22 if(xhr.readyState==4 && xhr.status==200){ 23 console.log('請求成功'); 24 if(config.dataType=='json'){ 25 console.log(JSON.parse(xhr.responseText)); 26 }else{ 27 console.log(xhr.responseText) 28 } 29 } 30 } 31 } 32 33 34 ajax({ 35 type:'get', 36 data:'name=zhangsan', 37 url:'http://www.example.com/api', // api接口url 38 dataType:'json' 39 })
2. 可索引類型接口(數組,數組對象)
1 /* 2 * ts中接口 3 * 可索引(數組型)接口 數組 可索引對象(hash、堆棧) 不常用 4 * */ 5 6 //可索引接口 7 interface UserArr{ 8 //定義索引key為number類型,索引值為string類型 9 [index:number]:string 10 } 11 12 var arr1:UserArr; 13 arr1=["aa","bb","cc"]; 14 var arr2: UserArr 15 arr2={1:"hello",2:"world"}; 16 console.log(arr1); 17 console.log(arr2); 18 19 20 /* 21 * ts中接口 22 * 可索引(數組對象) 23 * */ 24 interface hanleA { 25 [index:number]:hanleB 26 } 27 28 interface hanleB { 29 name: string, 30 age: number, 31 flag?: boolean 32 } 33 function handleReduce(arr: hanleA) { 34 console.log(arr) 35 } 36 37 handleReduce([{name: 'shun', age: 12}, {name: 'enne', age: 12}])
3.類類型接口
1 /* 2 * ts中接口 3 * 類類型接口: 對類的規范 ,這種類型的接口在傳統面向對象語言中最為常見, 4 * 比如java中接口就是這種類類型的接口 。這種接口與抽象類比較相似,但是接口只能含有為抽象方法、成員屬性。 5 * 實現類中必須實現接口中所有的抽象方法和成員屬性。 6 * */ 7 8 interface Animal{ 9 name:string; 10 eat(s:string):string; 11 } 12 13 //實現接口使用implements關鍵字,繼承 使用extends關鍵字 14 //狗類 15 class Dog implements Animal{ 16 name:string; 17 constructor(name:string){ 18 this.name=name; 19 } 20 //實現接口中抽象方法 21 eat(s){ 22 return this.name+"吃肉:"+s; 23 } 24 } 25 //貓類 26 class Cat implements Animal{ 27 name:string; 28 constructor(name:string){ 29 this.name=name; 30 } 31 //實現接口中抽象方法 32 eat(s){ 33 return this.name+"吃魚:"+s; 34 } 35 } 36 37 var dog=new Dog("tom"); 38 var cat=new Cat("kitty"); 39 console.log(dog.eat("五花肉")); 40 console.log(cat.eat("烏鱧魚"));
4.泛型函數、泛型類、泛型接口
1 /* 2 * ts中泛型 3 * 泛型就是在編譯期間不確定方法的類型(廣泛之意思),在方法調用時,由程序員指定泛型具體指向什么類型 4 */ 5 6 //1 泛型函數 7 8 /** 9 * 獲取數組中最小值 (數字) 10 * @param {number[]} arr 11 * @returns {number} 12 */ 13 function getMinNumber(arr:number[]):number{ 14 var min=arr[0]; 15 arr.forEach((value)=>{ 16 if(value<min){ 17 min=value; 18 } 19 }); 20 return min; 21 } 22 23 /** 24 * 獲取數組中最小值 (字符串) 25 * @param {number[]} arr 26 * @returns {number} 27 */ 28 function getMinStr(arr:string[]):string{ 29 var min=arr[0]; 30 arr.forEach((value)=>{ 31 if(value<min){ 32 min=value; 33 } 34 }); 35 return min; 36 } 37 38 console.log(getMinNumber([1, 3, 5, 7, 8]));//1 39 console.log(getMinStr(["tom","jerry","jack","sunny"]));//jack 40 41 /** 42 * 獲取數組中最小值 (T泛型通用) 43 * @param {T[]} arr 44 * @returns {T} 45 */ 46 function getMin<T>(arr:T[]):T{ 47 var min=arr[0]; 48 arr.forEach((value)=>{ 49 if(value<min){ 50 min=value; 51 } 52 }); 53 return min; 54 } 55 56 console.log(getMin([1, 3, 5, 7, 8])); 57 console.log(getMin(["tom","jerry","jack","sunny"])); 58 59 60 //2 泛型類 61 class GetMin<T>{ 62 arr:T[]=[]; 63 add(ele:T){ 64 this.arr.push(ele); 65 } 66 min():T{ 67 var min=this.arr[0]; 68 this.arr.forEach(function (value) { 69 if(value<min){ 70 min=value; 71 } 72 }); 73 return min; 74 } 75 } 76 var gm1= new GetMin<number>(); 77 gm1.add(5); 78 gm1.add(3); 79 gm1.add(2); 80 gm1.add(9); 81 console.log(gm1.min()); 82 83 var gm2= new GetMin<string>(); 84 gm2.add("tom"); 85 gm2.add("jerry"); 86 gm2.add("jack"); 87 gm2.add("sunny"); 88 console.log(gm2.min()); 89 90 91 92 /** 93 * 3 泛型函數接口 94 */ 95 interface ConfigFn{ 96 <T>(value:T):T; 97 } 98 99 var getData:ConfigFn=function<T>(value:T):T{ 100 return value; 101 } 102 getData<string>('張三'); 103 // getData<string>(1243); //錯誤 104 105 106 // 類似 Map<String,Object> Param 接口 107 interface Param{ 108 [index:string]:any 109 } 110 111 112 113 //4 泛型類接口 114 115 /** 116 * page分頁對象 117 */ 118 class Page{ 119 private currentPage:number=1; //當前頁碼 默認1 120 private pageSize:number=10;//每頁條數 默認為10 121 private sortName:string; //排序字段 122 private sortOrder:string="asc"; // 排序規則 asc | desc 默認為asc正序 123 124 125 constructor(param:Param){ 126 if(param["currentPage"]){ 127 this.currentPage=param["currentPage"]; 128 } 129 if(param["pageSize"]){ 130 this.pageSize=param["pageSize"]; 131 } 132 if(param["sortName"]){ 133 this.sortName=param["sortName"]; 134 } 135 if(param["sortOrder"]){ 136 this.sortOrder=param["sortOrder"]; 137 } 138 } 139 140 public getStartNum():number{ 141 return (this.currentPage-1)*this.pageSize; 142 } 143 } 144 145 146 class User{ 147 id:number;//id主鍵自增 148 name:string;//姓名 149 sex:number;//性別 1男 2女 150 age:number;//年齡 151 city:string;//城市 152 describe:string;//描述 153 154 } 155 156 //泛型接口 157 interface BaseDao<T> { 158 findById(id:number):T;//根據主鍵id查詢一個實體 159 findPageList(param:Param,page:Page):T[];//查詢分頁列表 160 findPageCount(param:Param):number;//查詢分頁count 161 save(o:T):void;//保存一個實體 162 update(o:T):void;//更新一個實體 163 deleteById(id:number);//刪除一個實體 164 } 165 166 /** 167 * 接口實現類 168 */ 169 class UserDao<User> implements BaseDao<User>{ 170 findById(id:number):User{ 171 172 return null; 173 } 174 findPageList(param:Param,page:Page):User[]{ 175 return []; 176 } 177 findPageCount(param:Param):number{ 178 return 0; 179 } 180 save(o:User):void{ 181 182 } 183 update(o:User):void{ 184 185 } 186 deleteById(id:number){ 187 188 } 189 }
5.函數型接口
1 /* 2 * ts中接口 3 * 函數型接口 ,非常類似於java、c#中使用lambda表達式傳入匿名函數 4 * 5 * */ 6 // 7 // //對兩個數進行運算得到另一個數 函數型接口 8 interface CalcTwo{ 9 (a:number,b:number):number; 10 } 11 12 13 /** 14 * 計算數組被某種算法運算的結果 15 * @param {number[]} arr 數組 16 * @param {CalcTwo} calc 用戶指定的算法函數 17 * @param {number} initVal 傳入初始值 18 * @returns {number} 得到最終運算結果 19 */ 20 function calcArr(arr:number[],calc:CalcTwo,initVal:number):number{ 21 var result=initVal; 22 arr.forEach((value)=>{ 23 result = calc(result,value); 24 }); 25 26 return result; 27 } 28 29 var arr:number[]=[1,3,5,7,9]; 30 var add=function(a:number,b:number):number{ 31 return a+b; 32 }; 33 34 var multiply=function(a:number,b:number):number{ 35 return a*b; 36 }; 37 console.log("相加",calcArr(arr, add, 0));//25 38 console.log("相乘",calcArr(arr, multiply, 1));//945 39 //或者直接傳入一個匿名函數亦可 40 var s1=calcArr(arr,function(a,b){ 41 return a*b; 42 },1); 43 console.log("s1",s1);//945 44 45 var s2=calcArr(arr,function (a,b) { 46 return (a+1)*(b+1); 47 },1); 48 console.log("s2",s2);//10170
