定义方式
- 接口(Interface):使用
interface
关键字定义,以大括号包裹成员定义。例如:
interface User {
name: string;
age: number;
}
- 类型别名(Type Alias):使用
type
关键字定义,等号后面跟类型描述。例如:
type User = {
name: string;
age: number;
};
功能特性
- 接口(Interface):
- 主要用于定义对象的形状,可重复声明,编译器会将重复声明合并。例如:
interface User {
name: string;
}
interface User {
age: number;
}
// 此时User接口同时有name和age属性
- 支持继承,可以通过
extends
关键字继承其他接口,复用已有接口的属性和方法。例如:
interface Person {
name: string;
}
interface Employee extends Person {
employeeId: number;
}
- 类型别名(Type Alias):
- 不仅可以定义对象类型,还能定义基本类型、联合类型、交叉类型等。例如:
// 基本类型别名
type MyString = string;
// 联合类型别名
type StringOrNumber = string | number;
// 交叉类型别名
type Admin = { name: string } & { role: string };
- 不支持重复声明,若重复声明相同名称的类型别名会报错。
- 类型别名可以通过
&
实现类似接口继承的效果,用于创建交叉类型。例如:
type Person = {
name: string;
};
type Employee = Person & {
employeeId: number;
};
使用场景
- 接口(Interface):
- 当专注于定义对象的公共形状,特别是在面向对象编程风格中,适合使用接口。例如定义类的公共属性和方法,或定义函数参数和返回值的对象结构。
- 在代码库中,如果需要多个地方复用对象结构,且可能需要逐步扩展该结构时,接口更为合适,因为其可重复声明和合并的特性。
- 类型别名(Type Alias):
- 当需要定义复杂类型,如联合类型、交叉类型,或者为基本类型创建别名以提高代码可读性时,类型别名更合适。
- 在函数式编程风格中,类型别名常用来定义函数参数和返回值的复杂类型,因为它能表达更灵活的类型组合。