TypeScript中的类型别名(Type Alias) 和 接口(Interface) 都是用来自定义类型的工具,但他们在语法和使用场景上有一些区别。
扩展和合并
- 类型别名:不能直接扩展和合并,但可以通过交叉类型来实现类似的效果。
type Point3D = Point & {z: number}
- 接口:可以扩展其他接口。
interface Point3D extends Point { z: number; } interface Point { x: number y: number }
使用场景
- 类型别名:适用于定义联合类型、交叉类型、元组等复杂类型。
type StringOrNumber = string | number type TupleType = [string, number]
- 接口:适用于定义对象形状,特别是在面向对象编程中定义类和对象的接口。
interface Person { name: string age: number }
实现和继承
- 类型别名:不能被实现
- 接口:可以被类实现
class MyPoint implements Point { x: number y: number }
字面量类型
- 类型别名:可以定义字面量类型
type Direction = 'N' | 'S' | 'E' | 'W'
- 接口:不能定义字面量类型
工具类型
- 类型别名:可以定义工具类型
type Partial<T> = { [P in keyof T]?: T[P]; };
- 接口:不能定义工具类型
总结
- 类型别名:适用于定义复杂类型、联合类型、交叉类型、元组等,但不能被类实现。
- 接口: 适用于定义对象的形状,特别是在面向对象编程中定义类和对象的接口,可以被类实现,可以扩展和合并