从TypeScript类型数组中排除特定类型

6
假设我有以下这些类型:
    /** Types of a function's arguments */
export type ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;

export type ExcludeQueryParams<T> = { [P in keyof T]: T[P] extends PagingParameters ? never : T[P] }

然后我有这个代码来提取函数参数的类型

function test(query: PagingParameters, as: number, f: string) {
    return 1;
}

type argTypes = ArgumentTypes<typeof test>
type result = ExcludeQueryParams<argTypes>

上面的代码中,argTypes将等于[PagingParameters, number, string]。
我想做的是从数组中提取PagingParameters类型,使得result等于[number, string]。然而,使用ExcludeQueryParams时,结果是[never, number, string]。
如何在不包含never类型的情况下正确实现这一点?

你在处理 ExcludeQueryParams 类型的内容吗? - Shaun Luttin
1
查看 编辑 @ShaunLuttin - joeblow
1个回答

0
您可以创建类型FilterFirstElement,它将排除数组的第一个元素。它使用泛型(任何种类的数组)和关键字infer(指其余数组参数)。
以下是代码示例:
type FilterFirstElement<T extends unknown[]> = T extends [unknown, ...(infer R)]
  ? R
  : [];

type arr1 = FilterFirstElement<[]>; // []
type arr2 = FilterFirstElement<[string]>; // []
type arr3 = FilterFirstElement<[string, number]>; // [number]
type arr4 = FilterFirstElement<[string, number, boolean]>; // [number, boolean]

2
请阅读[答案]并[编辑]您的答案,以包含有关此代码实际解决问题的说明。请记住,您不仅要解决问题,还要教育OP和任何未来读者。 - Adriaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接