请参阅以下代码示例:
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 中的项目,从而不必显式指定它们?
您实际上是在问如何迭代对象的所有属性。这可以使用
Object.keys(myObj)
方法来完成,该方法返回 myObj 中定义的所有属性的数组(不包括原型 props)。
每个属性的值可以通过方括号表示法访问。
所以你可以这样做:
const WrapSet = (inner: FuncSet): FuncSet => {
return Object.keys(inner).reduce((acc, key) => {
acc[key] = Wrap(inner[key]);
return acc;
}, {});
};