TypeScript
的核心原则之一是对值所具有的结构进行类型检查。接口是对象的状态(属性)和行为(方法)的抽象(描述)。
可选属性
只是在可选属性名字定义的后面加一个 ?
符号。可选属性的好处之一是可以对可能存在的属性进行预定义,好处之二是可以捕获引用了不存在的属性时的错误。
ts
interface IPerson {
id: number
name: string
age: number
sex?: string // 可有可无
}
只读属性
一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用 readonly
来指定只读属性。
最简单判断该用 readonly
还是 const
的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const
,若做为属性则使用 readonly
。
ts
interface IPerson {
readonly id: number // 只读属性
name: string
age: number
sex?: string
}
一旦赋值后再也不能被改变了。
ts
const person2: IPerson = {
id: 2,
name: 'tom',
age: 20,
// sex: '男' // 可以没有
// xxx: 12 // error 没有在接口中定义, 不能有
}
person2.id = 2 // error
函数类型
通过接口的方式为函数的类型来使用。为了使用接口表示函数类型,我们需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。
ts
// 定义调用签名
interface SearchFunc {
(source: string, subString: string): boolean
}
// 定义一个函数,该类型就是上面定义的接口函数
const mySearch: SearchFunc = function (source: string, sub: string): boolean {
return source.search(sub) > -1
}
console.log(mySearch('abcd', 'bc'))
类类型
类的类型可以通过接口来实现
类实现接口
ts
// 定义接口 Alarm
interface Alarm {
alert(): any;
}
// 定义接口 Light
interface Light {
lightOn(): void;
lightOff(): void;
}
// 定义一个类实现如上接口
class Car implements Alarm {
// 实现接口方法
alert() {
console.log('Car alert');
}
}
一个类可以实现多个接口
ts
class Car2 implements Alarm, Light {
alert() {
console.log('Car alert');
}
lightOn() {
console.log('Car light on');
}
lightOff() {
console.log('Car light off');
}
}
接口继承接口
和类一样,接口也可以相互继承。 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里
ts
interface LightableAlarm extends Alarm, Light {
}