前言: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

ts中接口的更多相关文章

  1. ts中接口的用法

    ts中的接口主要的作用是: 对“对象”进行约束描述 对“类”的一部分行为进行抽象 一.属性接口 接口中可定义 确定属性.可选属性.任意属性.只读属性 1.确定属性 interface UserInfo ...

  2. ts中的接口

    // 接口:接口是一种定义行为和规范,在程序设计中接口起到限制和规范的作用.接口定义某一 // 一批类所需要遵循的规范,接口不关系这些类的内部实现,之规定这些类必须提供某些方法 /* 1.对批量方法进 ...

  3. TypeScript完全解读(26课时)_9.TypeScript完全解读-TS中的类

    9.TypeScript完全解读-TS中的类 创建class.ts文件,并在index.ts内引用 创建一个类,这个类在创建好后有好几个地方都标红了 这是tslint的一些验证规则 一保存就会自动修复 ...

  4. Vue实践TS中的一些常见错误解决方案

    mixin报错 import { Component, Prop, Vue ,Mixins} from 'vue-property-decorator' import httpminix from ' ...

  5. PHP面向对象学习五 类中接口的应用

    类中接口的应用 接口:一种成员属性全部为抽象的特殊抽象类,在程序中同为规范的作用   抽象类:1.类中至少有一个抽象方法.2.方法前需要加abstract 接口: 1.类中全部为抽象方法,抽象方法前不 ...

  6. 创业者拿到融资别高兴太早,当心TS中的优先清算权

    最近创投圈的新闻读起来真是让人有些绝望啊,一家家创业公司接连宣告倒闭,其中不乏一些走在比较后面的“明星企业”,冷不丁冒出点消息,却是创始人发的公告,宣布公司资金链断裂,进入破产清算程序,或被低价并购. ...

  7. 如何记录selenium自动化测试过程中接口的调用信息

    上一篇博客,我写了python自动化框架的一些知识和粗浅的看法,在上一篇中我也给自己提出一个需求:如果记录在测试过程中接口的调用情况?提出这个需求,我觉得是有意义的.你在测试过程中肯定会遇到一些莫名其 ...

  8. Ionic3在ts中获取html中值的方法

    我觉得有两种方法,都是Angular中的语法,一种是把值当做参数传递,另一种是使用ngModel实现双向绑定 还有一种很少用到的,Js的原生方法:document.getElementById('ch ...

  9. ts中的类的定义,继承和修饰符

    自己搞一个ts文件 里面写代码如下,试一下就行了 /* 1.vscode配置自动编译 1.第一步 tsc --inti 生成tsconfig.json 改 "outDir": &q ...

  10. angular2在ts中使用transform转换时间格式

    摘要:在angular1中我们可以在控制器中像下面那样使用filter: $filter('date')(myDate, 'yyyy-MM-dd'); 但是如何在angular2中在ts中使用自定义p ...

随机推荐

  1. C# 动态操作 控件位置绑定 [ Anchor ] 属性

    注: 1.此类属于非常用类,只因本人需要编写的...顺便刷贴一下 2.对于初学,其中的枚举使用可以为你加深一点印象 以下为操作类代码: public class AchCtrer { #region ...

  2. ggplot axis text 拐弯

    scale_y_discrete(position = "left",labels=function(x) str_wrap(x, width=48)) +

  3. VS Code中使用live Server

    live server可以实时查看代码更改后的变化.测试十分快速. 1.安装live server 在扩展中搜索 live server,然后点击安装.等待安装完毕进行下一步配置. 2.打开设置界面: ...

  4. ubuntu下删除U盘文件到回收站无法清空问题的解决

    Ubuntu可以自动加载U盘 每当,拷贝新的文件,而空间不足的时候,就会删除原有的文件. 可是,它不是彻底删除,而是放在垃圾箱中(/home/mrc/.local/share/Trash/files) ...

  5. 动力节点的MySQL的34题目的第7题的我的参考答案

    以下是:薪水的平均等级最低的部门的名称 select t4.t4deptno,t4.t4grade,d1.dname from( ##求出各部门平均等级begin select avg(t3.t3gr ...

  6. 学习记录--C++多态性简答+编程题

    #include<iostream> #include<string> //双目运算符:运算符作用域两个操作数 //定义一个复数类,重载"+",作为复数类的 ...

  7. Unity打Android包报错总结 长期更新

    报错1  Failed to compile resources with the following parameters: -bootclasspath "E:\software\And ...

  8. fatal: unable to access ' ' OpenSSL SSL_read: Connection was reset, errno 10054

    描述: git clone ...时报错 fatal: unable to access 'https://github.com/github-eliviate/papers.git/': OpenS ...

  9. 痞子衡嵌入式:我当选了2019年度官方论坛i.MXRT板块的顶级贡献者

    痞子衡桌上有一个联邦快递公司件,放了近一个月了,是同事代领的,痞子衡一直没有拆开.今天心血来潮,决定拆开瞧一瞧,这一拆就拆出了一天的好心情. 原来快递里面是一件i.MXRT产品纪念T-shirt,还有 ...

  10. 基于机器学习的语音编解码器声网Agora Silver:支持超低码率下的高音质语音互动

    从 1860 年电话发明,到现如今通过网络进行语音互动,语音始终是最自然.最基础的实时互动方式.过去几年,语音实时互动成为越来越多人日常生活的一部分.但是每个人都会遇到弱网环境,这会直接影响语音通话体 ...