编程前端开发员

严格检查null和undefined的参数strictNullChecks在TypeScript中是如何工作的?开启它对日常编程有什么影响?

用 Hintsage AI 助手通过面试

答案

参数strictNullChecks定义TypeScript是否将nullundefined视为单独的类型。如果参数关闭(在2.0版本之前默认),任何类型的变量都可以接受nullundefined而不产生编译错误。如果开启(strictNullChecks: true),这些值被视为与其他类型不兼容,除非明确指定。

示例:

// strictNullChecks: false let name: string = null; // OK // strictNullChecks: true let title: string = null; // 错误! let title2: string | null = null; // OK,显式联合类型

启用严格检查有助于在开发早期阶段避免错误,当函数/方法未考虑获取nullundefined的可能性时。

诱导性问题

在开启strictNullChecks的情况下,可以将值undefined赋给类型为number的变量吗?

答案: 不可以,如果开启strictNullChecks,则不能将undefined赋给类型为number的变量——除非明确声明类型为number | undefined

示例:

let count: number = undefined; // 在strictNullChecks: true下TS错误 let count2: number | undefined = undefined; // OK

由于不理解该主题的细微差别导致的实际错误示例。


故事

在一个大型node.js项目中,开发者为了“简化迁移”关闭了null/undefined的严格检查。结果在上线一年后,API的一个函数返回了undefined而不是数字值。客户端代码对此没有准备,导致用户端应用在简单计算response.count + 1时崩溃。


故事

在一个电子商务项目中,产品集合从服务器返回为null而非[]。UI组件对这些产品进行了map操作,导致每个产品调用属性时发生渲染错误。启用strictNullChecks后,几乎立即高亮出了近40个类似的问题。


故事

在一个大型库中,随着时间推移,某些组件API的“允许”值的数量变为string | null | undefined。这导致许多未处理的情况。启用strictNullChecks后,成功捕获了在特定配置下界面崩溃的微妙bug。