如何基于指定子串筛选TypeScript联合类型成员?
从TypeScript联合类型中筛选包含指定子串的成员
可以通过TypeScript的条件类型结合模板字符串类型实现这个需求,具体代码如下:
type AllTypes = "hello.world"|"love.typescript"|"learn.typescript"|"love.stackoverflow" // 定义通用筛选类型,匹配包含指定子串的字符串类型 type FilterIncludes<T extends string, Sub extends string> = T extends `${infer _Start}${Sub}${infer _End}` ? T : never; // 针对AllTypes筛选包含"typescript"的成员 type TypescriptTypes = FilterIncludes<AllTypes, "typescript">; // 最终TypescriptTypes的类型为:"love.typescript" | "learn.typescript"
原理说明
- 模板字符串类型
${infer _Start}${Sub}${infer _End}会匹配所有包含子串Sub的字符串类型,infer关键字用于捕获子串前后的任意内容(无需使用时可用下划线命名占位) - 条件类型会对联合类型的每个成员逐一判断,匹配成功的成员被保留,失败的返回
never - TypeScript会自动从联合类型中剔除
never类型,最终得到仅包含目标子串的成员集合
内容的提问来源于stack exchange,提问作者Forte Zhuo
相关产品推荐
相关产品推荐

