TypeScript:如何从元组类型中移除undefined条目
如何过滤元组中的Undefined类型?
嘿,你提的这个需求完全可以实现!你之前尝试的映射类型思路方向是对的,但确实没法直接过滤掉undefined元素——因为映射类型会保留原元组的所有索引位置,哪怕把undefined换成never,元组的长度还是不会变。不过我们可以借助TypeScript的条件类型+infer关键字,通过递归的方式来处理元组,实现真正的元素过滤。
直接上可行的类型定义:
type FilterUndefined<T extends any[]> = T extends [infer First, ...infer Rest] ? First extends undefined ? FilterUndefined<Rest> : [First, ...FilterUndefined<Rest>] : [];
来测试一下你的例子:
type OriginalTuple = [number, string, undefined, number]; type FilteredResult = FilterUndefined<OriginalTuple>; // 此时 FilteredResult 的类型就是 [number, string, number],完全符合你的需求!
简单解释一下这个类型的工作逻辑:
- 我们用
T extends [infer First, ...infer Rest]解构元组:把第一个元素提取到First变量,剩下的元素组成新的元组Rest。 - 接着判断
First是否是undefined:如果是,就跳过这个元素,直接递归处理剩下的Rest;如果不是,就把First保留,再拼接上递归处理Rest后的结果。 - 当元组被解构到空的时候(也就是
T extends []的情况),返回空元组作为递归的终止条件。
如果之后你需要过滤其他类型(比如null),只需要修改判断条件就行,比如改成First extends undefined | null,就能同时过滤掉这两种类型啦。
内容的提问来源于stack exchange,提问作者Jan van Brügge
相关产品推荐
相关产品推荐

