You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TMakeEmberPostMessageParams自动生成TypeScript函数多参数类型

从对象类型生成函数多参数类型的解决方案

当然可以直接从TMakeEmberPostMessageParams对象类型生成TMakeEmberPostMessage的函数多参数类型,无需逐个手动指定。我们可以通过TypeScript的元组映射工具类型实现这一点,同时保留原函数的参数顺序和可选性。

实现步骤

  1. 定义对象转参数元组的工具类型
    这个工具类型会根据指定的属性顺序,把对象类型的属性映射为函数参数的元组,自动处理可选属性的类型:
type ObjectToParamsTuple<T, Keys extends Array<keyof T>> = {
  [Index in keyof Keys]: Keys[Index] extends keyof T 
    ? T[Keys[Index]] // 直接取对应属性的类型,可选属性会自动带上undefined
    : never;
};
  1. 重构TMakeEmberPostMessage类型
    利用上面的工具类型,传入TMakeEmberPostMessageParams和需要的属性顺序数组,就能直接生成函数的参数元组:
type TMakeEmberPostMessageParams<dataT> = {
  type: string;
  data: unknown;
  mockSource?: (type: string, data: unknown) => Promise<dataT> | dataT;
  defaultDelay?: number;
  settingName?: string;
  requestId?: string | number;
};

type TMakeEmberPostMessage<dataT> = (
  ...args: ObjectToParamsTuple<TMakeEmberPostMessageParams<dataT>, ['type', 'data', 'mockSource', 'defaultDelay', 'settingName', 'requestId']>
) => Promise<dataT>;

这样修改后,TMakeEmberPostMessage的参数类型会和TMakeEmberPostMessageParams完全同步,后续如果Params类型有修改,函数参数类型会自动更新,无需手动维护。

关于对象参数类型的复用

对于像TGetEmberUrlParams这类需要组合自定义属性和Params中部分属性的场景,你当前使用Pick的方式已经是最优解,它能精准复用目标属性的类型,同时扩展自定义字段:

type TGetEmberUrlParams<dataT = unknown> = {
  route?: string;
  params?: Record<string, unknown>;
  queryParams?: Record<string, unknown>;
  emberMainDomain?: boolean;
  returnUrl?: boolean;
  openInNewTab?: boolean;
} & Pick<TMakeEmberPostMessageParams<dataT>, 'type' | 'mockSource' | 'defaultDelay' | 'settingName'>;

内容的提问来源于stack exchange,提问作者Henok Tesfaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:33