首页 > 解决方案 > 如何为返回新函数的函数设置正确的返回类型,最后一个参数是可选的

问题描述

我正在尝试创建一个返回一个新函数的函数,该函数将最后一个参数作为可选参数,但我不知道如何实现正确的返回类型。

类似于(我知道这不起作用,因为LastOptional不存在):

export function convert<T extends (...args: any[]) => void>(convertFunction: T): (...args: LastOptional<Parameters<T>>) => void {
  ...
}

像这样使用:

function test(first: string, second: number): void {
  if (first === 'hello') {
    console.log('bye');
  } else if (second === 4) {
    console.log(5);
  }
}

const converted = convert(test);

converted('hello');

在这里,converted应该有类型签名:

const converted: (first: string, second?: number | undefined) => void

谢谢。

标签: typescript

解决方案


我设法用以下类型完成了这项工作:

export type LastOptional<T extends any[]> =
  T extends [infer T1] ? [T1?] :
  T extends [infer T1, infer T2] ? [T1, T2?] :
  T extends [infer T1, infer T2, infer T3] ? [T1, T2, T3?] :
  T extends [infer T1, infer T2, infer T3, infer T4] ? [T1, T2, T3, T4?] :
  T extends [infer T1, infer T2, infer T3, infer T4, infer T5] ? [T1, T2, T3, T4, T5?] :
  T;

像这样使用:

export function convert<T extends (...args: any[]) => void>(convertFunction: T): (...args: LastOptional<Parameters<T>>) => void {
  ...
}

但是,这不会保留参数名称,欢迎提出有关如何保留这些名称的任何建议。


推荐阅读