ZDecode
Typescript

type/interface

相同点

  • 都可以用来描述对象的结构
  • 都支持扩展(继承) 可用交叉类型(&)
  • 都可以被用作函数参数、返回值的类型、泛型等

不同点

特性interfacetype
✅ 用于对象结构✔️✔️
✅ 继承(extends)✔️ 支持多继承✔️ 可用交叉类型(&)
✅ 合并声明✔️ 支持自动合并❌ 不支持
✅ 可用于联合类型❌ 不支持✔️ 支持
✅ 定义基本类型别名❌ 不支持✔️ 支持
✅ 定义元组❌ 不支持✔️ 支持
✅ 映射类型/条件类型❌ 不支持✔️ 支持

示例对比

  1. 定义对象结构
interface User {
  name: string;
  age: number;
}

type UserType = {
  name: string;
  age: number;
};
  1. 扩展
interface A { x: number }
interface B extends A { y: number }

type AType = { x: number }
type BType = AType & { y: number }
  1. 接口合并(只适用于 interface)
interface Person {
  name: string;
}

interface Person {
  age: number;
}

// 最终效果:{ name: string; age: number }
  1. 联合类型(只有 type 可以)
type Status = 'success' | 'error';
  1. 原始类型别名
type ID = string | number;
  1. 条件类型(type 专属)
type IsString<T> = T extends string ? true : false;

补充说明

  1. 联合类型(Union Type)

表示一个值可以是几种类型之一,用 | 连接。

type Status = 'success' | 'error' | 'loading';

function show(status: Status) {
  // status 只能是三者之一
}
type Id = string | number;

let userId: Id = 123;
userId = 'abc'; // 都合法
  1. 元组类型(Tuple Type)

固定长度、固定类型顺序的数组。

const user: [string, number] = ['Tom', 25];
// user[0] 必须是 string,user[1] 必须是 number
type Point = [x: number, y: number];
type LogEntry = [timestamp: number, message: string, level?: 'info' | 'warn' | 'error'];
  1. ✅ 交叉类型(Intersection Type)

组合多个类型为一个类型,用 & 连接。所有属性都会被合并。

type HasName = { name: string };
type HasAge = { age: number };

type Person = HasName & HasAge;

const p: Person = {
  name: 'Alice',
  age: 30
};
  1. 映射类型(Mapped Type)

对已有类型的每个属性做变换,常用于工具类型。

type User = {
  name: string;
  age: number;
};

// 所有属性变成可选:
type PartialUser = {
  [K in keyof User]?: User[K];
};

等价于内置的 Partial<T>

你也可以变成只读:

type ReadonlyUser = {
  [K in keyof User]: Readonly<User[K]>;
};
  1. 条件类型(Conditional Type) 根据条件返回不同类型。
type IsString<T> = T extends string ? true : false;

type A = IsString<string>; // true
type B = IsString<number>; // false

再比如提取 Promise 的结果类型:

type UnwrapPromise<T> = T extends Promise<infer R> ? R : T;

type A = UnwrapPromise<Promise<number>>; // number
type B = UnwrapPromise<string>; // string