TypeScript 中 interface 和 type 的区别是什么?
请全面对比 TypeScript 中 interface 和 type 关键字在功能、用法上的区别。
回答
我是大山
相同点:
- 都可以描述对象形状
- 都可以被类实现(
implements) - 都支持泛型
核心区别:
1. 合并声明(Declaration Merging)
interface:支持同名合并(自动合并属性)type:不支持重名(报错 Duplicate identifier)
interface User { name: string; }
interface User { age: number; } // ✅ 合并为 { name: string; age: number; }
type User2 = { name: string; };
type User2 = { age: number; }; // ❌ 报错
2. 扩展语法
interface:extends关键字type:交叉类型&
interface A extends B {}
type C = A & B & { extra: string };
3. 可表达的类型
interface:只能描述对象类型type:可以描述任何类型(联合、元组、基本类型别名、条件类型等)
type Status = 'idle' | 'loading' | 'success' | 'error'; // 联合类型
type Point = [number, number]; // 元组
type func = (x: number) => void; // 函数类型
type Maybe<T> = T | null; // 泛型别名
type Result = typeof someVariable; // 类型推导
4. 计算属性
type支持映射类型和条件类型
type Readonly<T> = { readonly [P in keyof T]: T[P] };
type IsString<T> = T extends string ? 'yes' : 'no';
建议:
- 描述 API/对象形状 →
interface(可扩展、合并) - 需要联合/映射/条件类型 →
type - 库的类型定义 →
interface(用户可扩展) - React Props/State →
interface(社区约定)