TypeScript 会根据 strictNullChecks 来决定是否检查 null 和 undefined

关闭 strictNullChecks

关闭 strictNullChecks 后,仍然可以正常访问可能为 null 或未定义的值,并且可以将 null 和未定义的值赋给任何类型的属性。这类似于没有空检查的语言(例如 C # 、 Java)的行为。缺乏对这些值的检查往往是 bug 的主要来源; 如果在他们的代码库中这样做是可行的,我们总是建议人们打开 strictNullChecks。

开启 strictNullChecks

打开 strictNullChecks 时,如果值为 null 或未定义,则需要在对该值使用方法或属性之前测试这些值。就像在使用可选属性之前检查未定义的值一样,我们可以使用 narrowing 来检查可能为 null 的值:

function doSomething(x: string | null) {
  if (x === null) {
    // do nothing
  } else {
    console.log("Hello, " + x.toUpperCase());
  }
}

非 null 断言运算符(后缀 !)

TypeScript 还有一种特殊的语法,可以在不执行任何显式检查的情况下从类型中删除 null 和 undefined。在任何表达式后写 “!” 可用于断言称值不为 null 或 undefiened

function liveDangerously(x?: number | null) {
  // No error
  console.log(x!.toFixed());
}

就像其他类型断言一样,这不会改变代码的运行时行为,因此当您知道该值不为 null 或 undefined 时,使用 “!”