打字稿说 p.a 可以在 if (p.a !== undefined) 的正文中未定义

typescript says p.a can be undefined in body of if (p.a !== undefined)

type T = {
    a?: {[key:string]:boolean}
}
const f = (p: T):void => {
    if (p.a !== undefined) {
        Object.keys(p.a).forEach(k => { p.a[k] = false;})
    }
}
p.a[k] 中的

p.a 被错误地加了下划线的消息是:"Object is possibly 'undefined'.(2532)".

if (p.a !== undefined) { 更改为 if (!p.a) { 没有帮助。

这是由于 forEach 处理程序的新范围,您可以只使用 for...in 循环:

type T = {
    a?: {[key:string]:boolean}
}
const f = (p: T) => {
    if (p.a !== undefined) {
        for (const k in p.a) {
            if(p.a.hasOwnProperty(k)) {
               p.a[k] = false;
            }
        }
    }
}

问题取决于作用域。

p.a[k] = false; 在您为 forEach 循环声明的函数内部运行。该函数不在检查 p.a 是否存在的同一范围内,因此,打字稿不能保证 p.a 不会未定义。

可以在这个相关问题中找到更多信息 https://github.com/Microsoft/TypeScript/issues/30576

您可以通过多种方式解决此问题。一种明显但奇怪的方式可能是:

if (p.a !== undefined) {
  Object.keys(p.a).forEach(k => {
    if (p.a !== undefined) {
      p.a[k] = false
    }
  })
}

另一个,如果 p.a 只是您输入的对象字面量,则可能是:

for (let k in p.a) {
  p.a[k] = false
}

你甚至不需要在这里勾选 if (p.a !== undefined) {

感谢 sebbab link 到 https://github.com/Microsoft/TypeScript/issues/30576

github 问题已关闭,因为在更改父对象后可以调用处理程序。 这里不是这种情况,但要了解它,Typescript 需要对 forEach 函数中执行的代码进行某种 运行 时间分析,即 difficult/impossible.

基于此,我更喜欢的解决方案是:

type T = {
    a?: {[key:string]:boolean}
}
const f = (p: T): void => {
    const t = p.a;
    if (t !== undefined) {
        Object.keys(t).forEach(k => { t[k] = false;})
    }
}

编辑:实际上,最适合我个人口味的解决方案是: -没有为每个 -没有 hasOwnProperty

type T = {
    a?: {[key:string]:boolean}
}
const f = (p: T):void => {
    if (p.a !== undefined) {
        for (const k of Object.keys(p.a)) {
            p.a[k] = false;
        }
    }
}