接口 interface:
接口以 interface 开头,一般用于以下两种情况:
- 接口一般用来声明对象。
和类型声明类似。
interface PersonInterface { name: string, age: number } let p: PersonInterface = { name: 'Lee', age: 18, }
- 接口可以被类实现:定义类时,可以使用 implements 去实现一个接口,也就是说,接口中定义的所有属性和方法,类中都必须实现。一个类可以实现多个接口,多个接口之间以逗号分隔。
interface PersonInterface { name: string, age: number, eating: () => void, } // Person 类必须实现 customInterface 接口,也就是说,customInterface 接口中定义的所有属性和方法,Person 类中都必须实现 class Person implements PersonInterface{ name: string age: number eating() {} }
接口支持继承:
接口支持使用 extends 实现继承。
interface PersonInterface {
name: string,
age: number
}
interface StudentInterface extends PersonInterface {
height: number
}
// 正确
let student: StudentInterface = {
name: 'Lee',
age: 18,
height: 1.88,
}
// 错误
let student1: StudentInterface = {
name: 'Mary',
age: 18,
}
接口和类型别名的区别:
接口和类型别名非常类似,因此,在定义对象类型的时候,大部分情况下可以任意选择使用。
实际开发过程中,定义非对象类型,更常使用 Type;定义对象类型,更常使用 interface,因为 interface 功能更多、可扩展性更强。
它们的区别是:
-
Type 使用范围更广;interface 只能用来声明对象。
interface peopleInterface { name: string, age: number } type peopleType = { name: string, age: number } type IDType = number | string
-
Type 不允许两个相同名称的别名存在;interface 可以多次声明同一个接口名称,并且接口最终的定义是加起来的总和。
也就是说,如果多次声明了同一个接口名称,在定义对象类型的时候,对象必须每个接口都符合。
// 正确 interface peopleInterface { name: string, age: number } interface peopleInterface { height: number } // 报错 type peopleType = { name: string, age: number } type peopleType = { height: number }
-
Type 不支持继承,interface 支持继承。
接口和抽象类的区别:
- 抽象类是事物的抽象,用来捕捉子类的通用特性(例如:猫、狗、鸟都是动物);接口通常是一些行为的描述(例如:猫会跑,汽车也会跑)。
抽象类是对事物的抽象,表达的是
is a
的关系,例如:猫是一种动物。
接口是对行为的抽象,表达的是has a
的关系,例如:猫拥有跑的行为。 - 抽象类通常用于一系列关系紧密的类之间;接口只是用来描述一个类应该具有什么行为。
- 一个类只能继承一个抽象类;但是一个类可以实现多个接口。
- 对于函数,抽象类中可以有实现体;但是接口中只能有声明。