【发布时间】:2021-11-30 08:09:23
【问题描述】:
我正在尝试创建一个可以转换类型函数的辅助类型
type Func1 = (id: string) => void;
到
type Func2 = (id: string, conf: { extraArg: boolean }) => void;
我发现 this answer 确实有效,但是它将第一个参数命名为 head 并且如果我要应用我的示例,则以下参数将命名为 id非常具有误导性。
为了我的目的,我稍微修改了这段代码
type Cons<T extends readonly any[], H> =
((head: H, ...tail: T) => void) extends ((...cons: infer R) => void) ? R : never;
type Push<T extends readonly any[], V>
= T extends any ? Cons<T, void> extends infer U ?
{ [K in keyof U]: K extends keyof T ? T[K] : V } : never : never;
export type FunctionWithExtraArgument<F extends (...args: any[]) => any, Arg, R> = (...args: Push<Parameters<F>, Arg>) => R;
但是我仍然无法获得解决命名问题的完整解决方案。
【问题讨论】:
标签: typescript type-inference typescript-generics variadic-tuple-types