TypeScript 类型体操:从入门到实用技巧

为什么要学”类型体操”

TypeScript 最被低估的能力,是它能在编译期把大量 Bug 挡在运行前。很多人只用到 string/number 这种基础类型,但真正省心的是泛型、条件类型、映射类型这些”高级玩法”——它们能让你改一个接口字段,所有调用处立刻报红,而不是半夜收到线上报错。

一、联合类型与字面量

type Status = 'pending' | 'running' | 'done';
function render(s: Status) { /* ... */ }
render('done');     // OK
render('error');    // 编译报错:不在联合内

二、泛型:让类型跟着数据走

function first<T>(arr: T[]): T | undefined {
  return arr[0];
}
const a = first([1, 2, 3]);     // a: number | undefined
const b = first(['x', 'y']);   // b: string | undefined

三、条件类型 + infer

条件类型像三元表达式,infer 能从已有类型里”提取”结构:

type ElementType<T> = T extends (infer U)[] ? U : T;
type X = ElementType<number[]>;   // number
type Y = ElementType<string>;     // string

四、映射类型:批量改造

把已有类型的每个属性统一加 readonly 或改可选:

type ReadonlyUser = {
  readonly [K in keyof User]: User[K];
};

五、内置工具类型够用大半

工具类型 作用
Partial<T> 所有属性变可选
Required<T> 所有属性变必填
Pick<T, K> 只取部分属性
Record<K, V> 构造键值映射类型
ReturnType<F> 提取函数返回值类型

六、实战:给 API 响应建类型

interface ApiResp<T> {
  code: number;
  msg: string;
  data: T;
}
type UserResp = ApiResp<{ id: number; name: string }>;

function getUser(): UserResp {
  // 返回结构不对,编译期直接报错
  return { code: 0, msg: 'ok', data: { id: 1, name: 'Agnes' } };
}

七、判别联合(Discriminated Union)

用同一个字段区分不同类型,配合 switch 让 TS 自动收窄:

type Shape =
  | { kind: 'circle'; r: number }
  | { kind: 'rect'; w: number; h: number };

function area(s: Shape) {
  if (s.kind === 'circle') return Math.PI * s.r ** 2;
  return s.w * s.h;   // 这里 TS 已知道是 rect
}

小结

类型体操不是炫技,而是把”运行时才发现的错”提前到”写代码时就看见”。从联合类型、泛型入手,再学条件类型和映射类型,你的 TypeScript 会从”加了类型的 JavaScript”进化成真正的类型安全护盾。

上一篇 Redis 持久化选型:RDB vs AOF 深度对比
下一篇 Jenkins vs GitLab CI vs GitHub Actions 选型指南
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]