繁体   English   中英

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

[英]Excluding function parameters by type in TypeScript

我希望能够采用一个带有 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;

唯一的问题是参数名丢失了,签名变成了:

function myTestFunction(args_0: string, args_1: string): void {
  ...
}

请问如何在不丢失参数名称的情况下做到这一点?

嗯,我不认为你可以做到这一点。

您可以做的是传播一个元组以保留名称

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>]

然后你正在生成一个未命名的元组。 并且这种重新重新构建元组的递归方法是目前通用地添加或删除元组成员的唯一方法。


所以我可能是错的,但我不确定当前版本的打字稿是否可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM