打字稿说 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;
}
}
}
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;
}
}
}