首页 > 解决方案 > 使用 TypeScript 的对象属性的动态返回类型

问题描述

我有一个接收对象并返回具有相同属性名称的方法对象的函数:

function someGenerator<P extends {}>(params: P) {
  return Object.keys(params).reduce((acc, key) => ({
    ...acc,
    [key]: () => {
      console.log(params[key]);
    },
  }), {});
}

基本上我想像这样使用它:

type Params = {
  str: string;
}

const params = {
  str: 'some text',
}

const someInstance = someGenerator<Params>(params);

someInstance.str();

我试图定义该函数的返回类型:

type ReturnType<P> = {
  [K in keyof P]: () => void;
}

但是这种类型并没有像我预期的那样工作,因为返回类型的定义没有像它应该的那样包含参数。

任何人都可以帮助定义返回类型吗?

标签: javascripttypescript

解决方案


.reduce推断类型通常被定义为累加器的起始值。reduce当我有一个返回d 值的函数时,我通常会这样做:

function someGenerator<P extends Record<string, any>>(params: P) {
  return Object.keys(params).reduce(
    (acc, key) => ({
      ...acc,
      [key]: () => {
        console.log(params[key]);
      }
    }),
    {} as Record<keyof P, () => void>
  );
}

推荐阅读