原文2017年7月发布并于2017年9月更新
strictnullcheck(严格的null检查)
我应该使用strictnullcheck
TypeScript编译器标志吗?
空指针是最常见的bug之一,而通过strictnullcheck
TypeScript编译器标志可以在很大程度上避免空指针。因为strictnullcheck
标志在TypeScript 2时添加的,所以它的使用还没有那么广泛。截至2017年9月,Angular项目和typeORM项目中使用了该标志,而VSCode、RxJS、ionor或Babylon.js都没有使用该标志。此外,新建一个TypeScript项目时strictnullcheck
并不默认开启,以保证向后兼容,并保持TypeScript是JavaScript的超集。
如果你准备编写一个新TypeScript项目,或者有时间将strictnullcheck标志引入到现有的项目中,我建议你这样做。你的应用会因此具备更高的安全性,使用严格的null检查也不会打乱代码,因应用程序本应包含这些检查。缺点是新开发人员还需要学习一个概念。对我来说,利大于弊,所以我建议打开严格的空检查。
严格的空检查的一个例子是:
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"noImplicitAny": true,
"strictNullChecks": true,
"outDir": "./dist"
},
"include": [
"src/**/*"
]
}
src/user.ts
interface User {
name: string;
age?: number;
}
function printUserInfo(user: User) {
console.log(`${user.name}, ${user.age.toString()}`)
// => error TS2532: Object is possibly 'undefined'.
console.log(`${user.name}, ${user.age!.toString()}`)
// => OK, you confirm that you're sure user.age is non-null.
// => 好的,你已经确认user.age是非空的。
if (user.age != null) {
console.log(`${user.name}, ${user.age.toString()}`)
}
// => OK, the if-condition checked that user.age is non-null.
// => 好的,if条件检查了user.age是非空的。
console.log(user.name + ', ' + user.age != null ? user.age.toString() : 'age unknown');
// => Unfortunately TypeScript can't infer that age is non-null here.
// => 不幸的是TypeScript不能在这里推断年龄是非空的。(译注:截止至2019年7月16日,TS依旧会报此错)
}
如上所述:
- 感叹号表示你确信(例如,通过在代码中的某个地方执行检查)可能为空的变量实际上是非空的。
- 如果执行If条件检查, TypeScript可以推断某些内容是非空的。
- 然而,对于三元运算符来说,不幸的是情况并非如此。