打字稿:过滤出剩余参数

疾病

我想从元组中动态删除类型编号(元组从函数参数获取),但是该编号可以是其余类型:

function myFn(num1: number, text: string, ...nums: number[]): void {}

type Args = Parameters<typeof myFn>; // [number, string, ...number[]] <- Will be using similar result in future examples

我有一个通过递归过滤整个元组的类型:

type Filter<T extends any[], U> = T extends [] ? [] :
    T extends [infer H, ...infer R] ?
    H extends U ? Filter<R, U> : [H, ...Filter<R, U>] : T;

它非常适合简单类型:

type Args = [number, string, number, Symbol, number];
type Result = Filter<Args, number>; // [string, Symbol];

但是,当一个休息类型出现在一个元组中时,它的类型不能过滤“数字”或“数字[]”:

type Args = [number, string, ...number[]];

type Result1 = Filter<Args, number>; // [string, ...number[]]
type Result2 = Filter<Args, number[]>; // [number, string, ...number[]]

操场

可能是什么问题,如何解决?

其余参数的类型是否不同?

为什么他通过“扩展”通过“ any”或“ number []”过滤器检查?

约瑟夫船长

您非常接近:

type Args = [number, string, ...number[]];

type Filter<T extends any[], F> = T extends [] ? [] :
    T extends [infer Head, ...infer Tail] ?
    Head extends F ? Filter<Tail, F> : [Head, ...Filter<Tail, F>] : [];

type Result1 = Filter<Args, number>; // [string]
type Result2 = Filter<Args, number[]>; // [number, string]

type Result3 = Filter<Args, number | number[]>; // [string]
type Result4 = Filter<Args, number | number[] | string>; // []

T用空数组替换了您的最后一个返回类型[]

其余元素必须在元组中位于最后。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章