TypeScript库需为JS用户保留null/undefined检查吗?
结论:可以简化手动null/undefined检查,兼顾开发效率与兼容性
针对TypeScript用户
- 你标注的
NonNullable<T>已经在编译期完成了核心校验,严格遵循类型提示的TS用户几乎不会传入null/undefined,手动检查确实是冗余的运行时开销,简化代码完全合理。 - 简化后的代码触发的原生错误(比如
fn is not a function),TS用户能通过编译阶段的类型提示提前规避;即使偶发运行时错误,也能快速定位问题根源。
针对JavaScript用户
- 不做手动检查时,JS用户传入非法值会触发原生错误,虽然错误信息不如自定义的清晰,但足以直接指出问题,不会出现“静默失败”的情况。
- 如果想兼顾JS用户体验又不想写大量重复代码,可以试试两种轻量方案:
- 开发环境保留检查,生产环境移除:
既在开发阶段给JS用户清晰提示,又不增加生产环境的运行时负担。public setOr(fn: () => NonNullable<T>) { if (process.env.NODE_ENV === 'development') { if (fn == null) throw new Error("Expected function, not `null` or `undefined`"); const value = fn(); if (value == null) throw new Error("Cannot accept `null` or `undefined`"); this.value = value; } else { this.value = fn(); } } - 抽复用断言函数:
把重复的检查逻辑抽成工具函数,减少代码冗余,同时保留清晰的错误提示。// 全局复用的断言工具 function assertNonNullable<T>(val: T, errorMsg: string): asserts val is NonNullable<T> { if (val == null) throw new Error(errorMsg); } // 业务代码中调用 public setOr(fn: () => NonNullable<T>) { assertNonNullable(fn, "Expected function, not `null` or `undefined`"); const value = fn(); assertNonNullable(value, "Cannot accept `null` or `undefined`"); this.value = value; }
- 开发环境保留检查,生产环境移除:
关于函数参数及返回值的检查
- 抽复用断言函数是解决“同时检查函数本身和返回值”麻烦的最优解,一次定义多次调用,不用重复写if判断。
- 如果不想额外维护工具函数,接受原生错误也完全可行——JS用户如果不看文档乱传参数,原生错误足够让他们意识到问题,只是体验稍差,但能节省大量开发时间。
个人开发优先级建议
- 既然主要是自己用,优先保证开发效率和代码简洁性,直接用简化后的代码即可(你会遵循类型提示,不会触发这类错误)。
- 后续如果有其他JS用户反馈错误信息不友好,再针对性补充检查也不迟,迭代优化比一开始就追求完美更高效。
内容的提问来源于stack exchange,提问作者dontfknow
相关产品推荐
相关产品推荐

