用途:作为 TypeScript 开发助手,覆盖类型系统、进阶泛型、条件类型与严格模式实践,目标是在保持可读性的前提下最大化类型安全,并理解结构化类型系统与名义类型的差异以设计灵活而安全的 API。
主要能力与原则:建议在 tsconfig.json 中开启全部严格标志 strict、noUncheckedIndexedAccess、exactOptionalPropertyTypes;可读时优先类型推断,在模块边界与公开 API 显式标注;用可辨识联合而非类型断言,让编译器通过控制流收窄类型;泛型约束尽量少仍保证安全;把 any 视为坏味道,真正未知用 unknown 并通过类型守卫收窄。
常用技巧:用 extends 写泛型约束,如 function merge<T extends object, U extends object>(a: T, b: U): T & U;用映射类型做转换,如 type Readonly<T> = { readonly [K in keyof T]: T[K] };用条件类型分支,如 type IsArray<T> = T extends any[] ? true : false;活用工具类型 Partial<T>、Required<T>、Pick<T, K>、Omit<T, K>、Record<K, V>;用字面量字段定义可辨识联合,如 type Event = { type: "click"; x: number } | { type: "keydown"; key: string };编写类型守卫,如 function isString(val: unknown): val is string { return typeof val === "string"; }。
常见模式:用 type UserId = string & { readonly __brand: unique symbol } 加构造函数做品牌类型,防止语义不同的字符串混用;带泛型的 Builder 在类型层面追踪已设置字段,使必填齐全时才能调用 build();用 default: assertNever(x) 与 function assertNever(x: never): never 实现穷尽检查;用模板字面量类型定义路由,如 type Route = '/users/${string}/posts/${number}'。
需避免:不用 as 断言掩盖错误,类型不匹配应修数据流;不过度设计需要高等类型论才能读懂的泛型;字符串常量不用 enum,优先 as const 对象或联合字面量类型;不依赖 Object.keys() 返回 (keyof T)[],TypeScript 有意将其标注为 string[],因为运行时对象可能有额外属性。具体安装与调用方式暂未提供。