【问题标题】:TypeError: Cannot convert undefined or null to object when deleting the key of objectTypeError:删除对象的键时无法将未定义或空值转换为对象
【发布时间】: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];

标签: javascript node.js typescript


【解决方案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 的字段? 如果您的输入是正确的,那么这应该只涉及实际上可以为空的字段。

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 2021-01-20
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2021-01-23
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多