接口 interface
在 TypeScript 学习总结之基础类型 那一章节中,我稍微学习了一下 接口 interface, 对它有了初步了解, 接下来总结的是 TS 文档接口这一章节。
函数类型 以官方文档代码为例, 我分析了几种函数注解的方式:
方式一:
(最常见的)
interface SearchFunc { (source : string , subString : string ): boolean ; }let mySearch : SearchFunc ; mySearch = function (source: string , subString: string ) { let result = source.search (subString); return result > -1 ; };
方式二:
// 这种注解方式, 你会发现它同样把函数的实现方式也给实现了。 这样做不太好
interface SearchFunc { (source : string , subString : string ): boolean ; }function mySearch (source: string , subString: string ): boolean { let result = source.search (subString); return result > -1 ; }
方式三:
// 通过 表达式的方式 你会发现 代码会显得特别长
interface SearchFunc { (source : string , subString : string ): boolean ; }let mySearch : (source: string , subString: string ) => boolean = function ( source: string , subString: string ): boolean { let result = source.search (subString); return result > -1 ; };
方式四:
把方式三 给抽离出来看看
使用类型别名:
使用 接口 interface (这个和方式一 就一模一样了))
// 1.类型别名 方式
type SearchFunc = (source: string , subString: string ) => boolean ;let mySearch : SearchFunc = function (source: string , subString: string ): boolean { let result = source.search (subString); return result > -1 ; };
// 2.接口 interface 方式 (最常见的)
interface SearchFunc { (source : string , subString : string ): boolean ; }let mySearch : SearchFunc = function (source: string , subString: string ): boolean { let result = source.search (subString); return result > -1 ; };
可索引的类型 接口
可索引的类型的接口 指的就是 数组类型的接口
可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。
TypeScript 支持两种索引签名:字符串和数字。 可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。
示例:
interface NumberArray { [index : number ]: number ; }let obj : NumberArray = { 0 : 1 , 1 : 2 , 2 : 3 , };let arr : NumberArray = [1 , 2 , 3 , 4 ];
因为当使用 number 来索引时, JavaScript 终究会将它转换成 string 然后再去索引对象。
由此可知:在索引签名中, string 是包含着 number 的
再举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Animal { name : string ; }class Dog extends Animal { breed : string ; }interface NotOkay { [x : string ]: Animal ; [x : number ]: Dog ; }
再看看 索引的返回值, 索引签名中 规定是什么类型就是什么类型,
因为 对象中 key 一定是字符串,但 value 不一定是
interface NumberDictionary { [index : string ]: number ; length : number ; name : number ; }
类 类型接口
对 类 的一部分行为进行抽象;
类实现所有接口中的属性和方法 && 对比 对象类: 抽象方法需要实现
与 C#或 Java 里接口的基本作用一样,TypeScript 也能够用它来明确的强制一个类去符合某种契约。
interface ClockInterface { currentTime : Date ; setTime (d : Date ): void ; }class Clock implements ClockInterface { currentTime = new Date (); setTime ( ) { } constructor (h: number , m: number ) {} }
类继承+类类型接口 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 interface Alarm { alert (): void ; }interface Light { color : string ; lightOn (): void ; lightOff (): void ; }class Door {}class securityDoor extends Door implements Alarm { alert ( ) { console .log ('咚咚咚' ); } }class car implements Alarm , Light { color = 'red' ; alert ( ) {} lightOn ( ) {} lightOff ( ) {} }
类静态部分与实例部分的区别 类是具有两个类型的:静态部分的类型和实例的类型
而 constructor 存在于类的静态部分, 所以不再检查的范围内
因此,类静态部分和实例部分需要单独分开来做
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 interface ClockInterface { currentTime : Date ; getTime (hour : number , mins : number ): any ; }interface ClockConstructor { new (hour : number , mins : number ): any ; }class Clock implements ClockInterface { currentTime = new Date (); getTime ( ) {} }function createClock (C: ClockConstructor, hour: number , mins: number ) { return new C (hour, mins); }let clock = createClock (Clock , 12 , 12 );
接口继承接口 因为 接口是对对象的形状进行描述; 所以接口可以继承接口,
和类一样,接口也可以相互继承。 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。
interface Shape { color : string ; }interface Square extends Shape { sideLength : number ; }let square = {} as Square ; square.color = 'blue' ; square.sideLength = 10 ;
混合类型 函数类型的 interface ,添加属性的方式来实现 对象的 interface
相当于 函数类型的 interface + 对象类型的 interface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 interface Counter { (start : number ): string ; interval : number ; reset (): void ; }function getCounter ( ): Counter { let counter = <Counter >function (start: number ) {}; counter.interval = 123 ; counter.reset = function ( ) {}; return counter; }let c = getCounter ();c (10 ); c.reset (); c.interval = 5.0 ;
接口继承类
接口可以接触接口
接口可以继承类
类可以实现接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Control { private state : any ; }interface SelectableControl extends Control { select (): void ; }class Button extends Control implements SelectableControl { select ( ) {} }class TextBox extends Control { select ( ) {} }
最后,看了俩遍文档还是有点迷。。。。。 以后多练习练习