如何筛选TypeScript联合类型,仅保留字符串或数字类型?
TypeScript联合类型筛选实现方案
方案一:按类型名称字符串筛选
如果你需要通过传入'number'或'string'这类字符串指定筛选目标,可以这样定义Filter类型:
type Filter<T, K extends 'number' | 'string'> = T extends (K extends 'number' ? number : string) ? T : never; // 使用示例 type all = 'a' | 'b' | 'c' | 1 | 2 | 3; type numbers = Filter<all, 'number'>; // 结果为 1 | 2 | 3 type strings = Filter<all, 'string'>; // 结果为 'a' | 'b' | 'c'
这个类型利用了TypeScript条件类型的分布式特性:当T是联合类型时,会逐个检查每个成员是否匹配目标类型(根据K的值判断是number还是string),匹配的成员被保留,不匹配的则被排除为never。
方案二:直接传入目标类型筛选
如果更倾向于直接指定目标类型(类似类型谓词的思路),可以简化Filter的定义,直接传入number或string作为筛选条件:
type Filter<T, U> = T extends U ? T : never; // 使用示例 type all = 'a' | 'b' | 'c' | 1 | 2 | 3; type numbers = Filter<all, number>; // 结果为 1 | 2 | 3 type strings = Filter<all, string>; // 结果为 'a' | 'b' | 'c'
这种写法更直观,本质是从联合类型T中提取所有属于U的成员,同样依赖条件类型的分布式特性逐个处理联合类型的每个元素。
内容的提问来源于stack exchange,提问作者Dinhero21
相关产品推荐
相关产品推荐

