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