0

我有一个示例中的 todo 对象,这是我的预期对象

foo ={
  name:'F',
  lastName: 'JOI',
  address:{
    street:'where?'
  }
}

我得到了所有这些字段以及我想要删除的更多属性,例如,这是我收到的对象

bar ={
  name:'F',
  lastName: 'JOI',
  address:{
    street:'where?'
  },
  more:'temp',
  prop:'should remove'
} 

有没有办法删除不必要的无循环 foreach 属性?如果有帮助,我正在使用 TypeScript

4

2 回答 2

0

不。

TypeScript 检查类型是否匹配,但它不提供任何工具来迭代类型属性,因为所有类型注释在编译时都会消失。

如果要删除多个键,则此信息必须存在于“JS 层”上,因为“TS 层”(类型、接口等)会被编译出来,因此您必须在某个地方有一个普通的 JS具有要删除(或保留)的所有键的对象或数组。可能的实现:

// keep only the keys you want
const bar = {
  name: bar.name,
  lastName: bar.lastName,
  address: bar.address,
}

// same but with a helper
const keepProps = (src, keys) => Object
  .entries(src)
  .reduce(
    (dst, [key, value]) => {
      if (keys.includes(key)) dst[key] = value;
      return dst;
    },
    {}
  );
const bar = keepProps(foo, ['name', 'lastName', 'address']);

// remove unwanted keys
const bar = { ...foo }; // spread is required to create a different object reference
delete bar.more;
delete bar.prop;

关于“没有 for 循环”的要求,这是不可能的,如果你想多次执行相同的操作,它要么是显式循环,要么是被语法隐藏的循环,比如{ ...obj }or Array.filter

于 2020-05-26T09:11:34.983 回答
0

最简单的就是直接给它写代码:

const foo: YourType = {
    bar.name,
    bar.lastName,
    bar.address,
    bar.street
};

// Use `foo`

这还具有在 TypeScript 中类型安全的优点;如果您尝试获取不是 的成员YourType或不存在 on的属性bar,您将收到来自 TypeScript 的错误。

于 2020-05-26T09:06:24.740 回答