TypeScript问题:可选确定键对象条件创建后仍提示对象可能未定义
TypeScript可选属性判断后仍提示"Object is possibly 'undefined'"的解决方法
问题代码
type t = "a" | "b" const o: { [key in t]?: Array<number> } = {} interface Thing { t: t; } const things: Array<Thing> = [{ t: "a"}] for (const thing of things ) { if (!(thing.t in o)) o[thing.t] = [] o[thing.t].push(1) // 错误提示:Object is possibly 'undefined' }
问题说明:上述代码中,尽管通过if (!(thing.t in o))判断并为对象o的可选属性赋值,但TypeScript仍提示该属性可能为undefined——这是因为TypeScript对in操作符的类型收窄能力有限,无法识别此时属性已被初始化。
解决方案
方法1:非空断言(!)
直接通过!告诉TypeScript当前属性一定存在,跳过可选性检查:
for (const thing of things ) { if (!(thing.t in o)) o[thing.t] = [] o[thing.t]!.push(1) }
方法2:替换条件判断为直接检查undefined
将in操作符换成直接判断属性是否为undefined,TypeScript能正确识别类型收窄:
for (const thing of things ) { if (o[thing.t] === undefined) o[thing.t] = [] o[thing.t].push(1) }
方法3:初始化时为所有属性设默认值
如果业务允许,初始化对象时直接为所有属性赋值空数组,移除可选性:
const o: { [key in t]: Array<number> } = { a: [], b: [] } // 后续代码无需再判断,直接使用 for (const thing of things ) { o[thing.t].push(1) }
方法4:自定义类型守卫
编写类型守卫函数,明确告诉TypeScript属性已定义:
function hasDefinedProperty<T extends object, K extends keyof T>(obj: T, key: K): obj is T & { [P in K]-?: T[P] } { return obj[key] !== undefined; } for (const thing of things ) { if (!hasDefinedProperty(o, thing.t)) { o[thing.t] = []; } o[thing.t].push(1); }
内容的提问来源于stack exchange,提问作者dbrugger
相关产品推荐
相关产品推荐

