Typescript "error TS2532: Object is possibly 'undefined'" 即使在未定义的检查之后

Typescript "error TS2532: Object is possibly 'undefined'" even after undefined check

我正在尝试在 tsc 上使用 --strict 选项,但我 运行 进入以下 "weird" 我似乎不明白的情况。

如果我写:

function testStrict(input: {query?: {[prop: string]: string}}) {
  if (input.query) {
    Object.keys(input.query).forEach(key => {
      input.query[key];
    })
  }
  return input;
}

编译器抱怨:

test.ts(5,9): error TS2532: Object is possibly 'undefined'.

(违规行是 input.query[key];

我不明白的是,我已经在函数 if (input.query) 的第一行用 if 守卫检查了未定义,所以 为什么编译器认为它可能未定义?

我通过在对象访问之前添加另一个相同的守卫来解决这个问题,例如:

function testStrict(input: {query?: {[prop: string]: string}}) {
  if (input.query) {
    Object.keys(input.query).forEach(key => {
      if (input.query) {
        input.query[key];
      }
    })
  }
  return input;
}

但我不明白为什么需要另一条相同的线。

因为对 input.query 的第二次访问发生在另一个函数内部,箭头函数传递给 forEach。流分析不跨越功​​能边界,所以既然你在另一个功能中,你需要再次测试。

双重测试的替代方法是使用局部变量,因为变量的类型在赋值时被锁定并且它不会包括 undefined 类型:

function testStrict(input: { query?: { [prop: string]: string } }) {
    if (input.query) {
        const query = input.query;
        Object.keys(input.query).forEach(key => {
            query[key];
        })
    }
    return input;
}