如何实现FilterIfContains类型?基于字符存在过滤联合类型使AlphaFoo为'foo'
实现FilterIfContains类型
我们可以利用TypeScript的条件类型和模板字面量类型实现需求,核心逻辑是逐个检查联合类型成员是否包含指定子串,仅保留不包含的成员:
type Foo = 'foo' | 'bar1' | '213' type Predicate = '1' type FilterIfContains<Element, Predicate extends string> = Element extends `${infer _Start}${Predicate}${infer _End}` ? never : Element; type AlphaFoo = FilterIfContains<Foo, Predicate>; // 结果为'foo'
代码说明
- 通过
Element extends${infer _Start}${Predicate}${infer _End}``判断当前成员是否包含Predicate子串:- 若匹配(即包含目标子串),返回
never将该成员从联合类型中排除 - 若不匹配,返回原成员保留下来
- 若匹配(即包含目标子串),返回
- TypeScript会自动对联合类型做分发条件类型处理,遍历
Foo的每个成员逐一检查,最终只留下不包含'1'的'foo'
内容的提问来源于stack exchange,提问作者iflp
相关产品推荐
相关产品推荐

