{ "answer": "深度 TypeScript 严格模式工作流——渐进式启用、编译器标志、类型边界、类型收窄、泛型、工具类型及安全重构。" }
TypeScript 严格模式( 深工作流)是一项面向实际任务的技能,主要用于策略是梯度, 而不是一个切换器;目标为减少运行时的惊喜, 而不会阻碍执行;
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
严格性是一种渐进式特性,而非单一开关。目标是在不阻碍交付的前提下,通过渐进式迁移与在 IO 边界处设置清晰的类型边界,显著减少运行时意外行为。
触发条件:
strict、strictNullChecks、noImplicitAny 或 noUncheckedIndexedAccessany 和 @ts-ignoreundefined、数据结构不匹配等).d.ts 导出声明初始建议:
采用六个阶段:(1)基线与目标设定,(2)编译器标志路线图,(3)边界类型定义(IO 边界),(4)类型收窄与穷尽性检查,(5)泛型与模式设计,(6)验证与防护机制。确认当前使用的TS 版本、构建工具(如 tsc、esbuild 等)以及monorepo 的目录结构。
目标:明确当前痛点与期望达成的严格程度,并以可度量指标为依据。
tsc --noEmit,统计总错误数及按错误数量排序的问题最集中的文件退出条件:基线错误数 + 明确的高优先级目录列表。
目标:以渐进方式启用各项编译器标志——集中修复错误簇,而非一次性处理整个仓库。
strictNullChecks(通常收益最高)noImplicitAny:对新文件强制启用,并逐步收紧旧文件strictFunctionTypes、strictBindCallApplynoUncheckedIndexedAccess(影响广泛,需提前规划 undefined 联合类型处理)exactOptionalPropertyTypes(边界情况较多,建议延后启用)// @ts-expect-error 并附带对应 issue 编号,替代无注释的 @ts-ignoretsconfig 配置,通过 extends 继承基础配置any 类型(借助 eslint 规则 @typescript-eslint/no-explicit-any)退出条件:一份明确的标志启用时间表,并为每个包指定责任人(owners)。
目标:对外部输入数据仅做一次校验;内部逻辑则完全信任已收窄的类型。
zod / io-ts / valibot 进行运行时解析与校验satisfies 操作符——保留字面量类型信息unknown 类型强制转换为其他类型type UserId = string & { __brand: 'UserId' }),防止类型混淆退出条件:所有新增的 IO 相关代码均已实现并文档化“解析 → 类型化”的完整流程。
目标:让控制流分析真正为你服务——善用可辨识联合类型(discriminated unions)与never 类型校验。
{ status: 'loading' } | { status: 'ok', data: T }switch 语句中配合 assertNever(x) 实现编译期穷尽性检查undefined 处理的选择,保持一致性undefined 或 null 中的一种约定,避免混用退出条件:若干代表性模块已完成重构,其中易引发错误的可选类型使用明显减少。
目标:在保障可复用性的同时,避免落入 any 类型泛滥的陷阱——合理运用约束(constraints)与默认类型(defaults)。
extends 设置泛型约束;除非确实需要完全通用,否则避免无约束泛型ReturnType / Parameters 等内置类型辅助类型推导tsc 编译速度——考虑拆分或简化此类类型退出条件:在共享库的风格指南中,已包含明确的泛型使用规范章节。
目标:确保严格性可持续维持——任何退化均能在 CI 中被及时捕获。
tsc --noEmit 检查,且结果为绿色(无错误)dtslint 或 tsd 对 library 的类型定义进行专项测试unknown 而非 any——强制在使用点执行类型收窄。noUncheckedIndexedAccess 时,提供辅助 getter 方法或基于 Record 的模式示例。d.ts 声明文件,或构建一个封装模块(wrapper module),仅暴露经收窄后的类型接口。