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 的字段应接受Dateundefined。如果你想包含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 转换为对象”[关闭]

TypeError:对象原型可能只是一个对象或空:未定义

Vue + typescript - TypeError:对象原型可能只是一个对象或空:未定义

Dojo.js AMD 加载程序 - 类型错误:无法将未定义转换为对象