在TypeScript中按类型排除函数参数

在TypeScript中按类型排除函数参数,typescript,conditional-types,Typescript,Conditional Types,我希望能够获取一个有n个参数的函数,并返回一个基于该函数的类型,其中任何类型为x的参数都不再在函数类型中。例如: function myTestFunction(email: string, context: TestContext, password: string): void { ... } 我想要一个用于创建函数定义的类型,如下所示: function myTestFunction(email: string, password: string): void { ... }

我希望能够获取一个有n个参数的函数,并返回一个基于该函数的类型,其中任何类型为x的参数都不再在函数类型中。例如:

function myTestFunction(email: string, context: TestContext, password: string): void {
  ...
}
我想要一个用于创建函数定义的类型,如下所示:

function myTestFunction(email: string, password: string): void {
  ...
}
我设法做到了这一点:

type Filter<T> = T extends [] 
  ? [] 
  : T extends [infer A, ...infer B] 
    ? A extends TestContext 
      ? Filter<B>
      : [A, ...Filter<B>]
    : T;
type ConvertFunction<T> = T extends (...args: any[]) => any
  ? (...args: Filter<Parameters<T>>) => ReturnType<T>
  : T;

如何才能做到这一点而不丢失参数名呢?

嗯,我认为您无法做到这一点

您可以做的是展开一个元组以保留名称

type MyTup = [a: string, b: number]
type MyTup2 = [...MyTup] // [a: string, b: number]
但是,当您从元组中获取单个值时,它将丢失其名称

type MyTup = [a: string, b: number]
type MyTup2 = [MyTup[0], MyTup[1] // [string, string]
如果将未命名成员与命名元组合并,则所有成员都将成为未命名成员:

type MyTup = [a: string, b: number]
type B = [MyTup[0], ...MyTup] // [string, string, string]
当然,您可以重新添加名称,但据我所知,无法实际获取元组成员的名称。所以一般来说没有办法做到这一点

type B = [asdf: MyTup[0], qwerty: MyTup[1]] // [asdf: string, qwerty: string]
所有这一切都意味着,当你这样做:

[A, Filter<B>]
[A,过滤器]
然后生成一个未命名的元组。这种重新构造元组的递归方法是目前唯一一种添加或删除元组成员的方法

type B = [asdf: MyTup[0], qwerty: MyTup[1]] // [asdf: string, qwerty: string]


所以我可能错了,但我不确定这在当前版本的typescript中是否可行。

您使用的是哪个版本的typescript?IIRC在TS4+中有改进。我使用的是TS v4.1.2。