我经常发现自己需要在TypeScrip中遍历一个大对象中的字段子集.我会经常使用析构来清理它,但我不喜欢重复的代码,即使它不是.有没有更好的办法让我失踪?

interface MyLargerObject {
  field1: string;
  field2: string;
  field3: string;
  field4: string;
  field5: string;
  field6: string;
  field7: string;
  field8: string;
  field9: string;
  otherField1: string;
  otherField2: string;
  otherField3: string;
  otherField4: string;
  otherField5: string;
}

interface MySmallerObject {
  field1: string;
  field2: string;
  field3: string;
  field4: string;
  field5: string;
  otherField1: string;
  otherField2: string;
}

function subsetMethod(largerObject: MyLargerObject): MySmallerObject {
  const {
    field1,
    field2,
    field3,
    field4,
    field5
  } = largerObject;
  
  return {
    field1,
    field2,
    field3,
    field4,
    field5,
    otherField1: 'new1',
    otherField2: 123
  };
}

另外,我们假设MyLargerObjectMySmallerObject之间可能有重叠.我想确保我不会在这些情况下用largerObject个值覆盖MySmallerObject的重叠字段.

推荐答案

如果您要大量编写这类代码,则可以使helper函数如下所示:

function pick<T extends object, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
  const ret = {} as Pick<T, K>;
  for (const key of keys) { ret[key] = obj[key] }
  return ret;
}

pick()函数接受generic类型T的对象obj和键列表keys,其中列表的元素的union是泛型K.该实现将所有命名属性复制到一个新对象中,该对象被返回并被赋予类型Pick<T, K>.

请注意,我在实现中需要一个type assertion,const ret = {} as Pick<T, K>,它不是类型安全的(显然,空对象可能不是该类型),但计划是在函数返回时断言将是正确的.


有了pick(),您就可以使用您关心的键在largerObject上调用它,然后在返回的对象文本中调用spread it,这样您就可以添加您需要的任何其他属性:

function subsetMethod(largerObject: MyLargerObject): MySmallerObject {
  return {
    ...pick(largerObject, "field1", "field2", "field3", "field4", "field5"),
    otherField1: "abc",
    otherField2: "def"
  }
}

Playground link to code

Typescript相关问答推荐

APP_INITIALIZER—TypeError:appInits不是函数

类型脚本强制泛型类型安全

扩展函数签名中的参数类型,而不使用泛型

如何在Type脚本中动态扩展函数的参数类型?

是否可以针对联合类型验证类型属性名称?

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

根据类型脚本中的泛型属性 Select 类型

判断映射类型内的键值的条件类型

将接口映射到交叉口类型

如何通过属性名在两个泛型数组中找到匹配的对象?

使用或属性编写无限嵌套的接口

如何在不违反挂钩规则的情况下动态更改显示内容(带有状态)?

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

如何在具有嵌套数组的接口中允许新属性

如何使函数参数数组不相交?

如何为带有参数的函数类型指定类型保护?

导航链接不触发自定义挂钩

有没有办法从不同长度的元组的联合中提取带有类型的最后一个元素?

从函数参数推断函数返回类型

创建通过删除参数来转换函数的对象文字的类型