typescript表示,在if(p.a!==undefined)的主体中,p.a可以是未定义的


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错误地加了下划线,并显示消息:"对象可能‘未定义’。(2532("。

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

问题依赖于作用域。

p.a[k] = false;在您为forEach循环声明的函数内部运行。该函数不在检查p.a是否存在的同一范围内,因此,typescript不能保证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) {

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

感谢sebbab提供的链接https://github.com/Microsoft/TypeScript/issues/30576

github问题已经解决,因为在父对象更改后可以调用处理程序。这里的情况并非如此,但要知道这一点,Typescript需要对forEach函数中执行的代码进行某种运行时分析,这是困难/不可能的。

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

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

编辑:实际上,对我个人口味来说,最好的解决方案是:-no for Each-无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;
}
}
}

相关内容

最新更新