CodeWalk

TypeScript 中 interface 和 type 的区别是什么?

作者:我是大山 · 2026-05-30 12:55

请全面对比 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. 扩展语法

  • interfaceextends 关键字
  • 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(社区约定)