如何一般设置映射类型的值

问题描述 投票:0回答:1

请参阅以下代码示例:

type Properties = {
  item0: { item0: string };
  item1: { item1: string };
  item2: { item2: string };
  item3: { item3: string };
  item4: { item4: string };
};

type Func<N extends keyof Properties> = ({}: Properties[N]) => number;
const Wrap = <N extends keyof Properties>(inner: Func<N>): Func<N> => {
  return (v: Properties[N]) => inner(v) + 2;
};
type FuncSet = { [Property in keyof Properties]: Func<Property> };
const WrapSet = (inner: FuncSet): FuncSet => {
  return {
    item0: Wrap(inner.item0),
    item1: Wrap(inner.item1),
    item2: Wrap(inner.item2),
    item3: Wrap(inner.item3),
    item4: Wrap(inner.item4),
  };
};

如何重构 WrapSet,使其能够迭代 Properties 中的项目,从而不必显式指定它们?

typescript mapped-types
1个回答
0
投票

您实际上是在问如何迭代对象的所有属性。这可以使用

Object.keys(myObj)
方法来完成,该方法返回 myObj 中定义的所有属性的数组(不包括原型 props)。

每个属性的值可以通过方括号表示法访问。

所以你可以这样做:

const WrapSet = (inner: FuncSet): FuncSet => {
  return Object.keys(inner).reduce((acc, key) => {
    acc[key] = Wrap(inner[key]);
    return acc;
  }, {});
};
© www.soinside.com 2019 - 2024. All rights reserved.