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;
}