04、TypeScript 中的接口
接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里面方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要,typescript 中的接口类似于 java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等
1.属性类型接口
// 1.属性类接口 对 json 的约束 // ts 中定义方法 function pr(): void { console.log('11'); } pr(); // ts 中定义方法传入参数 function pr1(label: string): void { console.log(label); } pr1('zhangning'); // ts 中自定义方法传入参数对象 json 进行约束 function pr2(labelInfo: { label: string }): void { console.log(labelInfo.label); } pr2({ label: 'zhangning' }); // 对批量方法传入参数进行约束 // 接口:行为和动作的规范,对批量方法进行约束 // 定义 FullName 接口 interface FullName { firstName: string; secondName: string; } function prn(full: FullName) {// 实现 FullName 接口 console.log(full.firstName + full.secondName); } // prn('zhangning');// 错误的写法 // prn({ firstName: 'zhang', secondName: 'ning', age: 24 });// 报错,有 age // 定义一个对象,对象中只要包含 接口 中的属性就可以了,尽量单独定义对象 let objn = { age: 24, firstName: 'zhang', secondName: 'ning' }; prn(objn); // 接口对批量方法进行约束 interface Info { firstName: string; secondName: string; } function prn1(full: Info) {// 实现 FullName 接口 console.log(full.firstName + full.secondName); } function prn2(info: FullName) { console.log(info.firstName + info.secondName); } // prn('zhangning');// 错误的写法 // prn({ firstName: 'zhang', secondName: 'ning', age: 24 });// 报错,有 age // 定义一个对象,对象中只要包含 接口 中的属性就可以了,尽量单独定义对象 let objinfo = { age: 24, firstName: 'zhang', secondName: 'ning' }; prn1(objinfo); prn2({ firstName: 'zhang', secondName: 'ning187' }); // 接口可选属性 interface Fullname2 { firstName: string; secondName?: string;// ? 表示可传可不传 } function getName(name: Fullname2) { console.log(name); } getName({ firstName: 'zhang' });// 不传递 secondName 也不会报错 // 通过接口模拟一个 ajax interface Configajax { type: string; url: string; data?: string; dataType: string; } // 原生 js 封装 ajax function testajax(config: Configajax) { let xhr = new XMLHttpRequest(); xhr.open(config.type, config.url, true); xhr.send(config.data); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { console.log('111'); if (config.dataType == 'JSON') { JSON.parse(xhr.responseText); } else { console.log(xhr.responseText); } } }; } testajax({ type: 'get', url: 'http://', dataType: 'JSON', data: 'data' });
2.函数类型接口
// 2.函数类型接口:对方法传入的参数,以及返回值进行约束 // 实现一个加密的函数类型接口 interface encrypt { (key: string, val: string): string; } // 实现这个方法的时候,要符合接口参数的规范 var md5: encrypt = function(key: string, val: string): string { return key + val; }; console.log(md5('zhang', 'ning'));// zhangning var sha11: encrypt = function(key: string, val: string): string { return key + '----' + val; };
3.可索引接口
// 3.可索引接口:数组的约束(不常用) // 定义数组的方式 let arr1: Array<string> = ['aaa', 'ddd']; let arr2: number[] = [111, 222]; // 定义对数组约束的接口 interface UserArr { [index: number]: string } var arr3: UserArr = ['123', '32232']; // 对对象的约束 interface UserObj { [index: string]: string | number } var arr6: UserObj = { name: 'zhangning', age: 24 };
4.类类型接口
// 4.类类型接口:对类的约束 和 抽象类有点相似 interface Animal { name: string; eat(str: string): void; } // 这里的实现方式有点不同,通过 implements 实现接口 class Dog implements Animal { name: string; constructor(name: string) { this.name = name; } eat(foot: string) { console.log(foot); } } // 用法和之前相同 var d = new Dog('小黑'); d.eat('吃骨头');
5.接口的扩展,接口继承接口
// 5.接口的扩展,接口可以继承接口 interface People { eat(): void; } interface Man extends People { work(): void; } class Web implements Man { name: string; constructor(name: string) { this.name = name; } eat() {// 因为 Man 继承了 People 接口,所以 eat() 方法也要实现 console.log('吃馒头'); } work() { console.log('程序猿'); } } var w = new Web('zhangning'); w.eat(); w.work(); // 定义一个程序猿类 class Programmer { name: string; constructor(name: string) { this.name = name; } coding(code: string) { console.log(this.name + code); } } class youngster extends Programmer implements People { constructor(name: string) { super(name); } eat() { console.log('吃饭'); } work() { console.log('写代码'); } }