ts中 type 和 interface 定义类型有什么区别?
type
定义基本类型别名:
-
type
可以定义基本的类型别名,例如:typescript
type Name = string; type Age = number;
联合类型和交叉类型:
-
type
支持创建联合类型和交叉类型,这在一些复杂的类型定义中非常有用。typescript
type Status = 'success' | 'error' | 'loading'; type UserResponse = { userId: string; userName: string } & { status: Status };
高级类型特性:
-
type
可以用来定义条件类型、映射类型等更高级的类型特性。typescript
type MessageOf<T> = T extends { message: infer M } ? M : never; type Properties<T> = { [K in keyof T]: T[K] };
缺点:
-
type
无法进行声明合并。 -
type
不支持扩展(继承)其他类型。
interface
定义对象类型:
-
interface
主要用于定义对象的结构。typescript
interface Person { name: string; age: number; }
扩展(继承):
-
interface
可以使用extends
关键字扩展其他接口,这在需要继承多个对象结构时非常有用。typescript
interface Employee extends Person { employeeId: number; }
声明合并:
-
interface
支持声明合并,即同名接口会自动合并所有声明的属性。typescript
interface Person { address: string; } interface Person { phone: string; } // 合并后的 Person 接口包含 name, age, address, phone 属性
缺点:
-
interface
不支持联合类型和交叉类型。 -
interface
在高级类型特性上不如type
灵活。
使用场景
何时使用 type
:
-
需要定义基本类型别名、联合类型或交叉类型时。
typescript
type ID = string | number; type User = { name: string; age: number } & { id: ID };
-
需要使用高级类型特性时,例如条件类型和映射类型。
typescript
type ReadOnly<T> = { readonly [P in keyof T]: T[P] };
何时使用 interface
:
-
主要定义对象类型,并且希望利用继承特性时。
typescript
interface Car { make: string; model: string; } interface ElectricCar extends Car { batteryLife: number; }
-
需要声明合并时,可以更方便地扩展类型。
typescript
interface User { name: string; age: number; } interface User { email: string; } // 合并后的 User 接口包含 name, age, email 属性
总结来说,type
更适合于定义复杂类型、联合类型和交叉类型,而 interface
更适合于定义对象类型并利用其继承和声明合并的特性。