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;
}
我正在尝试在 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;
}