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

Anupheaus

我希望能够使用带有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>]

然后,您将生成一个未命名的元组。当前,这种重新构造元组的递归方法是通用地添加或删除元组成员的唯一方法。


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在TypeScript中按值类型排除对象键

Typescript-排除参数中其他类型的键

如何从Typescript中的函数获取参数类型

TypeScript箭头函数中参数的类型

函数参数是TypeScript类型中存在的属性

函数的类型推断作为 Typescript 中的参数

Typescript - 获取嵌入在函数类型参数中的类型

函数中的泛型不检查Typescript中的参数类型

根据TypeScript中的参数在字典中定义函数的返回类型

限制Node.js和TypeScript中的函数参数的类型

在TypeScript中获取函数参数名称和类型

使用Typescript中的函数参数隐式类型推断

TypeScript:在函数中强制使用通用推断的类型参数

TypeScript - 基于参数类型的函数返回类型

Typescript 函数参数作为函数或类型

按类型在React Router中排除路径参数的值

通过Typescript中的其他函数参数推断函数参数的类型

基于其参数类型的函数类型参数的TypeScript类型推断

TypeScript中的条件参数类型

跟踪 TypeScript 中的参数类型

按会员类型排除类型

如何在TypeScript中为函数参数设置参数名称和类型?

如何将具有多种类型的参数作为参数传递给 Typescript 中的函数?

如何根据Typescript中的字符串参数定义函数的参数类型?

TypeScript函数参数的类型不会出错?

TypeScript可重用函数参数类型

TypeScript类型化函数参数接受任何

Typescript从参数返回函数的类型

TypeScript 类型:Object.defineProperty 函数参数