Typescript "ошибка TS2532: возможно, объект undefined" даже после undefined проверки

Я пытаюсь использовать параметр --strict на tsc, но я столкнулся с следующим "странным" случаем, который, кажется, не понимаю.

Если я пишу:

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): ошибка TS2532: объект возможно "undefined".

(строка нарушения input.query[key];)

То, что я не понимаю, я уже проверил для undefined с защитой if в первой строке функции if (input.query), поэтому почему компилятор считает, что это может быть undefined

Я исправил это, добавив еще один одинаковый защитник перед доступом к объекту, например:

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

но я не понимаю, зачем нужна другая идентичная строка.

Ответ 1

Поскольку второй доступ к 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;
}