ts中接口


前言:ts定義接口的任意一個屬性

interface IPerson {
  name: string
  age: number
  family?: any[] // Error,因為不是任意類型的子集
  [propName: string]: string | number // 一般設置 any,因為其他類型必需是任意類型的子集
  [propName: string]: any // 一個 interface 中任意屬性只能有一個
}
View Code

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM