如何从TMakeEmberPostMessageParams自动生成TypeScript函数多参数类型
从对象类型生成函数多参数类型的解决方案
当然可以直接从TMakeEmberPostMessageParams对象类型生成TMakeEmberPostMessage的函数多参数类型,无需逐个手动指定。我们可以通过TypeScript的元组映射工具类型实现这一点,同时保留原函数的参数顺序和可选性。
实现步骤
- 定义对象转参数元组的工具类型
这个工具类型会根据指定的属性顺序,把对象类型的属性映射为函数参数的元组,自动处理可选属性的类型:
type ObjectToParamsTuple<T, Keys extends Array<keyof T>> = { [Index in keyof Keys]: Keys[Index] extends keyof T ? T[Keys[Index]] // 直接取对应属性的类型,可选属性会自动带上undefined : never; };
- 重构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
相关产品推荐
相关产品推荐

