TypeScript最佳实践是否使用strictnullcheck

32次阅读

共计 1424 个字符,预计需要花费 4 分钟才能阅读完成。

原文 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 依旧会报此错)
}

如上所述:

  1. 感叹号表示你确信 (例如,通过在代码中的某个地方执行检查) 可能为空的变量实际上是非空的。
  2. 如果执行 If 条件检查, TypeScript 可以推断某些内容是非空的。
  3. 然而,对于三元运算符来说,不幸的是情况并非如此。

正文完
 0