我希望能够使用带有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] 删除。
我来说两句