TypeError:删除对象的键时无法将未定义或空值转换为对象
Posted
技术标签:
【中文标题】TypeError:删除对象的键时无法将未定义或空值转换为对象【英文标题】:TypeError: Cannot convert undefined or null to object when deleting the key of object 【发布时间】:2022-01-16 21:28:27 【问题描述】:如果键的值为 null 并且键的类型是可选的,我想从对象的对象中删除键。
例如我有这样的对象接口:
Interface IObject
amount: number;
plan: IPlan;
achieve: IAchieve;
status?: string;
rank?: number;
Interface IPlan
year: string | null;
name: string;
date?: Date;
grade?: number;
Interface IAchieve
pic: string;
name?: string;
date?: Date;
grade?: number;
并且有价值:
let data: IObject =
amount: 2300;
plan:
year: null;
name: 'renov';
date: null;
grade: 3;
;
achieve:
pic: 'John';
name: null;
date: null;
grade: 3;
;
status: 'good';
rank: null;
;
我做了什么:
Object.keys(data).forEach(obj =>
if (typeof data[obj as keyof typeof IObject] === 'object')
Object.keys(data[obj as keyof typeof any]).forEach(obj2 =>
if (data[obj as keyof typeof any][obj2] == undefined)
delete data[obj as keyof typeof any][obj2];
);
else if (data[obj as keyof typeof any] == undefined) delete data[obj as keyof typeof any];
);
但我明白了:
“TypeError:无法将 undefined 或 null 转换为对象”
我期待结果:
data =
amount: 2300;
plan:
year: null;
name: 'renov';
grade: 3;
;
achieve:
pic: 'John';
grade: 3;
;
status: 'good';
;
【问题讨论】:
在哪一行是错误...开始寻找那里...我猜,你的索引是错误的。 在我看来,您似乎试图在运行时(在执行代码期间)访问 Typescript 类型信息,这是不可能的。或者我误解了你在做什么。 @helle at delete data[obj as keyof typeof any][obj2]; 【参考方案1】:这个问题有几个问题。
语法问题
interface
不是 Interface
。
见Everyday Types: Interfaces
创建对象时,在字段之间使用,
分隔符,而不是;
。
见Object initializer。
类型为date?: Date
的字段应接受Date
和undefined
。如果你想包含null
,那么你应该写成date?: Date | null
。
见Everyday Types: null
and undefined
。
typescript variant of typeof
只能用于检索变量或属性的类型。 typeof IObject
会尝试获取接口的类型,但这是行不通的。
我不明白你想用这样的行做什么:obj as keyof typeof any
。
功能问题
如果键的值为 null 并且键的类型是可选的,我想从对象的对象中删除键。
如果我对这一行的理解正确,那么您是在尝试使用接口定义在运行时执行某些操作。 这将不起作用,在 typescript 被编译成 javascript 之后,接口将不再出现在您的代码中。 见The Basics: Erased Types。
你需要从不同的角度来解决这个问题。
也许您无论如何都可以从您的对象中删除所有值为null
的字段?
如果您的输入是正确的,那么这应该只涉及实际上可以为空的字段。
【讨论】:
以上是关于TypeError:删除对象的键时无法将未定义或空值转换为对象的主要内容,如果未能解决你的问题,请参考以下文章
在“reactstrap”导航栏中使用“折叠”时“无法将未定义或空值转换为对象”
收到错误“创建 HelloWorld 错误:TypeError:无法将未定义或 null 转换为对象”
Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”[关闭]