两者都描述数据的形状,通常可以互换,但它们的功能不同。
ts
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
两者都描述数据的形状,通常可以互换,但它们的功能不同。
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
type 可以做但 interface 不能做的type ID = string | number; // unions
type Pair = [number, number]; // tuples
type Name = User["name"]; // indexed/mapped/conditional types
type Nullable<T> = T | null; // wrap any type
type 是任何类型的通用 alias — primitives、unions、tuples、mapped types。interface 仅描述 object/function 的形状。
interface 可以做但 type 不能做的interface Box { width: number; }
interface Box { height: number; } // declaration merging — both merge into one
// Box now has width AND height
Interfaces 支持 declaration merging(多个声明合并)并且是扩展/增强的习语用法,包括增强第三方库类型。
interface Admin extends User { role: string; } // interface
type Admin2 = User & { role: string }; // type uses intersection
常见的约定:对对象形状和公共 API 使用 interface(提供更好的错误消息、可扩展、可合并),在需要 unions、tuples 或其他类型操作时使用 type。选择一个作为默认值以保持一致性 — 许多团队默认对对象使用 interface,只有在需要其额外功能时才使用 type。