用途:这是一项 TypeScript 类型设计技能,针对含可空值的数据结构。核心原则是让值要么完全为 null,要么完全非 null,不出现混合状态;把 null 处理推到系统边界,而不是散布在代码各处。
主要能力与模式:
- 全有或全无类型:两个值同 null 或同非 null 时,用一个可空元组或对象表达,而不是两个各自可空的字段。示例中 extent 从返回 [number | undefined, number | undefined] 改为返回 [number, number] | null。
- 判别联合:将 data、error、loading 等可空字段改为 status 判别联合(idle、loading、success、error),使每种状态自洽,避免 data 与 error 同时存在等矛盾状态。
- 工厂方法:类中异步初始化时,用私有构造函数加静态 create,确保实例要么完全初始化要么不存在,消除部分初始化状态与竞态。
- 边界模式:在函数入口处理 null,之后内部使用非空类型,减少重复检查。
适用场景:设计含多个可空字段的类型;发现 null 检查散布于代码;相关值总是一起为 null;调试 undefined is not an object 错误;重构含大量可选属性的类型。
限制:技能基于《Effective TypeScript》Item 33,具体实现细节、版本要求或额外工具暂未提供。文中注明该规则无例外,但需注意这是设计建议,应与项目实际情况结合。