typescript 在解构的同时对属性进行处理

hl0ma9xz  于 6个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(67)

我经常遇到这样的情况:在解构对象之前,我想对某个对象的属性调用相同的方法。例如,我有一个记录,其中一些属性有一个从信号/回调返回值的方法,而其他属性有一个相同的方法,只返回一个普通值。我想解构它们,这样我就只得到值了:

type ValueLike<T> = { value(): T };

const cb = () => 50;
const aProp: ValueLike<number> = { value: () => cb() };
const bProp: ValueLike<number> = { value: () => 100 };

const props = { a: aProp, b: bProp };
const { a, b } = props // Want to end up with { a: 50, b: 100 };

字符串
当然,我可以写一些辅助函数,称为类似unwrapAll()的东西,它接受一个对象,在每个属性上调用.value(),将这些属性分配给一个新对象,然后解构它。然而,我想知道是否有某种方法可以避免创建中间对象,而不必单独分配每个属性(即const a = props.a.value(), const b = props.b.value(), ...)。

new9mtju

new9mtju1#

在解构对象的同时不能进行其他处理。
然而,有一种类似于deleted answer的方法,它使用getter函数来实现你的目标,它不可避免地创建了一个中间对象,只有value()在解构时才会被调用。

function wrap(obj) {
  return Object.entries(obj).reduce((acc, [k, v]) => 
    Object.defineProperty(acc, k, { get() {
      return v.value();
    }}), {});
}

const cb = () => 50;
const aProp = { value: () => cb() };
const bProp = { value: () => 100 };

const props = wrap({ a: aProp, b: bProp });
const { a, b } = props;

console.log(a, b);

字符串

相关问题