在 TypeScript 中,interface 和 type 都用于描述对象或函数类型,主要区别在于它们的语法和使用方式不同。下面我来介绍一些具体的区别和应用场景:
- 语法区别
interface 的语法:
interface User {
name: string,
age: number,
gender: 'male' | 'female',
}
type 的语法:
type User = {
name: string,
age: number,
gender: 'male' | 'female',
}
可以看到,interface 和 type 的定义方式有所不同,但它们都用来定义相同的用户数据类型。
- 声明合并
interface 在定义时可以重复声明,这样它们会自动合并为一个类型,例如:
interface User {
name: string,
}
interface User {
age: number,
}
let user: User = {
name: 'Bob',
age: 30,
}
以上示例中,两个 User 接口中的属性合并成了一个 User 接口,最终的 user 变量可以正确地使用。
而 type 则不支持声明合并。
- 类型别名
type 可以用于定义类型别名,例如:
type Gender = 'male' | 'female'
type User = {
name: string,
age: number,
gender: Gender
}
以上示例中,Gender 类型别名可以被重复使用,并且可以像内置类型一样被定义。
- 联合和交叉类型
type 支持联合和交叉类型,在定义时可以使用 & 和 | 运算符,例如:
type UserA = {
name: string,
age: number,
}
type UserB = {
gender: 'male' | 'female',
}
type User = UserA & UserB
let user: User = {
name: 'Bob',
age: 30,
gender: 'male',
}
以上示例中,User 类型使用 & 运算符将 UserA 和 UserB 类型合并成一个类型,最终的 user 变量可以正确地使用。
而 interface 不支持交叉类型,只支持联合类型:
interface UserA {
name: string,
age: number,
}
interface UserB {
gender: 'male' | 'female',
}
interface User extends UserA, UserB {}
let user: User = {
name: 'Bob',
age: 30,
gender: 'male',
}
以上示例中,User 接口使用 extends 关键字将 UserA 和 UserB 接口合并成一个接口,最终的 user 变量可以正确地使用。
- 普通对象和类构造函数
interface 可以用来描述普通对象,例如:
interface Point {
x: number,
y: number,
}
let point: Point = {
x: 10,
y: 20,
}
而 type 则更适用于描述类构造函数:
type Point = {
new (x: number, y: number): { x: number, y: number },
}
let point: Point = class {
constructor(public x: number, public y: number) {}
}
以上示例中,Point 类型使用 new 关键字定义了一个类构造函数,point 变量可以正确地使用。
总之,interface 和 type 在 TypeScript 中都用于描述对象或函数类型,但是语法和使用场景有所不同。通常来说,interface 更适用于描述普通对象类型,而 type 更适用于描述复杂类型,如函数类型、泛型类型、联合类型和交叉类型等。可以根据场景和需求选择合适的语法和类型定义方式。