手写 Partial / Required / Pick / Omit 深度解析
TypeScript 内置的 Partial、Required、Pick、Omit 是类型体操的九九乘法表,也是面试高频手写题,写不出来基本告别高级岗。 本质都是映射类型加可选必填修饰符,以及 K extends keyof T 的键约束,掌握后可推导出 Mutable、PartialByKeys 等进阶变换。
TypeScript 内置的 Partial、Required、Pick、Omit 是类型体操的九九乘法表,也是面试高频手写题,写不出来基本告别高级岗。 本质都是映射类型加可选必填修饰符,以及 K extends keyof T 的键约束,掌握后可推导出 Mutable、PartialByKeys 等进阶变换。
infer 等于类型世界的'解构赋值',在条件类型的匹配模式中声明类型变量,由 TS 自动把匹配到的类型片段填进去。 提取函数返回值、解构 Promise、拆数组元组,全是一行代码的事。
类型守卫就是让 TS 编译器'读懂你的 if'——typeof x === 'string' 之后,x 在 if 块里自动收窄为 string,无需手动 as。 用好它能消灭九成类型断言,安全与可读性兼得。
映射类型让 TS 类型系统有了'循环':[P in keyof T] 遍历对象的每一个属性并对其类型进行变换。 一行代码即可定义 Partial、Pick、Readonly 等内置工具类型的核心逻辑。
条件类型等于类型世界的 if-else:T extends U ? X : Y,所有内置工具类型(Exclude、Extract、ReturnType…)都是它的子句。 不理解分发机制,类型体操就寸步难行。
类型不是看会的,是敲会的——接口、泛型、keyof、条件类型必须上手实现一遍练出手感。 面试时才能不卡壳,本文是配套实战练习。
enum 是 TypeScript 少数'活到运行时'的语法:数字枚举编译出双向映射对象,const enum 直接蒸发。 选错要么包体积多几 KB,要么 isolatedModules 直接报错。
泛型是类型的'函数参数',把类型也变成可传递的变量,一份代码处理多种类型且不丢失精度。 面试能否写出带泛型的工具函数,直接决定对你 TS 水平的定位。
interface 支持声明合并(给第三方库打补丁),type 能表达联合、交叉、元组、映射类型(interface 做不到)。 公开库类型用 interface 留扩展点,带 variant 的 Props 用 type 写联合,多数对象两者皆可。
TS 基础类型面试不考你认不认识 string | number,而考三道安全心法:unknown 为何优于 any、strictNullChecks 防住了什么、never 为何最被低估。 安全心法比死记类型更重要。