打字稿将列表映射到函数参数

Typescript map a list to function arguments

我有一个参数列表,看起来有点像这样:

const args: FeatureEventArg[] = [
  {
    name: 'username',
    type: 'string',
  },
  {
    name: 'message',
    type: 'string',
  },
  {
    name: 'totalMessagesSent',
    type: 'number',
  },
];

我的目标是使用该列表和某种类型(例如 FeatreEventArgs<typeof args> 或其他类型)来获取回调函数的参数,最终看起来像这样:

function callback(username: string, message: string, totalMessagesSent: number) {
  // Other stuff
}

我已经设法通过很多 fideling 和很多 extends "string" ? string 之类的东西来获得类型部分。但是名称只是 arg_0 而不是上面对象中的名称。

无论如何,如果您对我如何实现此目的或任何其他问题解决方案有任何提示或想法,请告诉我。

您需要删除 : FeatureEventArg[] 并解释对象数组 as const 以便保留准确的字符串类型。然后您可以映射数组的 [number] 值,将名称提取为键并将类型提取为值(通过将字符串转换为相应类型的辅助类型)。

const args = [
  {
    name: 'username',
    type: 'string',
  },
  {
    name: 'message',
    type: 'string',
  },
  {
    name: 'totalMessagesSent',
    type: 'number',
  },
] as const;
type Args = typeof args;
type ToPrimitive<T> =
    T extends 'string' ? string
  : T extends 'number' ? number
  : never;

type ArgsObj = {
  [T in Args[number] as T["name"]]: ToPrimitive<T["type"]>
}