【问题标题】:Remove fields from typescript interface object从打字稿接口对象中删除字段
【发布时间】:2017-10-27 10:25:37
【问题描述】:

我得到一个 json 响应并将其存储在 mongodb 中,但是我不需要的字段也进入了数据库,有没有去除不相关的字段?

interface Test{
    name:string
};
const temp :Test = JSON.parse('{ "name":"someName","age":20 }') as Test;
console.log(temp);

输出:

{ name: 'someName', age: 20 }

【问题讨论】:

  • 我相信您需要创建一个没有不需要的属性的新对象并将当前对象转换为该对象。最好从同一个接口继承两个接口。

标签: javascript json typescript


【解决方案1】:

假设你想删除年龄

temp = {...temp, age: undefined}

这将从您的对象中永久删除 age

【讨论】:

  • 如果有很多我不希望出现的字段怎么办?
  • 明白我必须手动选择我想要的字段,我有大约 30 个字段,我需要大约 10 个
  • 是的,如果您要删除的密钥很少,这会很快。选择的答案是好的,不要使用delete!这很慢!
【解决方案2】:

您可以使用从给定对象中选择某些属性的函数:

function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
    const copy = {} as Pick<T, K>;

    keys.forEach(key => copy[key] = obj[key]);

    return copy;
}

然后:

let obj = { "name": "someName", "age": 20 };
let copy = pick(obj, "name") as Test;
console.log(copy); // { name: "someName" }

【讨论】:

  • 我找到了一个 npm 包 ts-transformer-keys 我们可以用你的函数自动指定键
  • 你看过the source吗?它实际上在运行时使用 ts 编译器 api 打开 ts 文件以获取对象中的键。这听起来有点过头了,我不会用它
【解决方案3】:

如果您想以强类型的方式执行此操作,您可以定义一个满足您的界面 (const dummy: IMyInterface = {someField: "someVal"};) 的虚拟/理想对象,然后根据 Object.keys(dummy) 过滤传入对象的字段。这样,如果您更新接口而不更新此“过滤”代码,您的编译器会报错。

【讨论】:

    【解决方案4】:

    假设你有这个对象。

    const x = {a: 1, b: 2, c: 3};
    

    如果你想制作一个只有ab的对象,可以使用下面的方法。

    const {c, ...y} = x;
    console.log(y);
    

    您会看到y 现在只有ab
    如果字段c 不在x 中,这也不会出错。例如,

    const x: any = {a: 1, b: 2, c: 3};
    const {d, ...y} = x;
    console.log(y);
    

    这工作得很好,没有任何错误,如果你记录 d 的值,它将是未定义的。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2018-08-20
      • 2023-03-28
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2021-07-24
      • 2019-04-23
      相关资源
      最近更新 更多