打字稿修改或扩展调用签名

Typescript modifying or extending call signatures

能否按如下方式修改函数调用签名:

给定 fn1:

type fn1 = ( a: string, b: number, c: string )=>void

需要伪代码输出:

type fn2 = ( ...fn1.parameters, d: number )=>void  // new type: ( a: string, b: number, c: string, d: number )=>void
//or
type fn2 = ( pick<fn1.parameters,'a','c'>, d: number )=>void // new type: ( a: string, c: string, d: number )=>void

您可以使用类型实用程序 Parameters<Type> 从函数中提取参数信息:

TS Playground

type Fn1 = (a: string, b: number, c: string) => void;

type Fn2 = (...params: [...Parameters<Fn1>, number]) => void; // (params_0: string, params_1: number, params_2: string, params_3: number) => void
type Fn3 = (...params: [a: Parameters<Fn1>[0], c: Parameters<Fn1>[2], d: number]) => void; // (a: string, c: string, d: number) => void