接口
-
介绍
在
typescript
中,接口的作用就是为类型检查命名和为代码获第三方代码提供契约 -
基本写法
interface label { labelStr: string }
-
可选属性
接口里的属性不全都是必需的。带有可选属性的接口预普通的接口定义差不多,只是在可选属性名字定义的后面加上一个
?
符号- 可选属性的书写方法
interface config { color?: string, width?: string }
-
只读属性
只能在对象刚刚创建时修改的属性,可以在属性名前用
readonly
来指定只读属性- 书写方法
interface config { readonly x: number }
-
额外的属性检查
如果一个对象字面量存在任何“目标类型”不包含的属性时,会返回一个错误
- 举例
// 定义接口 interface config { color?: string, width?: number } // 创建函数使用接口 function user(config: config): {color: string, area: number} { ... } // 调用函数的时候 let User = user({colors: 'red', width: 100}) // 报错,不存在colors
- 解决方法1:使用 类型断言
let User = user({color: 'red', width: 100} as config)
- 解决方法2:在接口中添加索引签名
interface config { color?: string, width?: number, [propName: string]: any }
-
函数类型
除了描述带有属性的普通对象意外,接口还可以描述函数类型
- 书写方法
// 只有参数列表和返回值类型的函数定义 interface SearchFunc { (source: string, subString: string): boolean }
- 对于函数的类型检查来说,函数的参数名不需要预接口里定义的名字相匹配
-
可索引的类型
可索引类型描述了对象索引的类型,还有相应的索引返回值类型
- 书写方法
interface config { [index: number]: string } let myConfig: config myConfig = ['zx', 'sjx'] let yourConfig: string = myConfig[0]
- 索引过程:当使用
number
来索引的时候,JavaScript会将它转换成string
然后再去索引对象 - 拓展:将索引签名设置为只读,就防止了给索引赋值
interface readonlyConfig { readonly [index: number]: string }
-
类类型
使用接口强制一个类去符合某种契约
- 书写方法
interface clock { currentDate: Date } class Clock implements clock { currentDate: Date constructor(){ ... } } // 也可以在接口中描述一个方法,在类里实现它 interface clock2 { currentDate: Date setTime(d: Date) }
提示:接口只是描述了类的公共部分,而不是公共和私有两部分。它不会检查类是否具有某些私有成员。
-
继承接口
可以将一个接口里的成员复制到另一个接口里,可以更灵活的将接口分割到可重用的模块里
- 书写方法
interface Sheet { color: string } interface Config extends Sheet { loading: boolean }
-
混合类型
一个接口对象可以同时作为函数和对象使用,并带有额外的属性。
- 书写方法
interface Counter { (start: number): string interval: number reset(): void } function useCounter(): 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
-
接口继承类
创建一个接口继承一个拥有私有或受保护的类时,这个接口类型只能被这个类或其子类所实现 (implement)。