如何在TypeScript中实现移除字符串类型指定后缀的工具类型
实现代码
你可以借助 TypeScript 4.1 以上版本支持的模板字面量类型 + 条件类型推断能力实现,代码如下:
type FooObj = { ASvg: any BSvg: any CSvg: any DSvg: any } // 核心实现 type WithoutSvgSuffix<T> = T extends `${infer Prefix}Svg` ? Prefix : never; type KeyofWithoutSuffix = WithoutSvgSuffix<keyof FooObj> // 最终推导结果为:'A' | 'B' | 'C' | 'D',完全符合预期
原理解释
- 匹配逻辑:
${infer Prefix}Svg是模板字面量匹配规则,会匹配所有以Svg为后缀的字符串字面量,并用infer关键字捕获后缀之前的前缀部分赋值给Prefix - 联合类型分发:条件类型默认对联合类型有自动分发特性,当你传入
keyof FooObj(本质是'ASvg' | 'BSvg' | 'CSvg' | 'DSvg'联合类型)时,每个成员会单独走匹配逻辑,匹配成功返回对应的前缀,匹配失败返回never,最终自动合并所有成功的结果,排除掉never项就得到了想要的联合类型。
如果需要适配任意后缀的通用场景,可以扩展成通用工具类型:
type RemoveSuffix<T extends string, Suffix extends string> = T extends `${infer Prefix}${Suffix}` ? Prefix : never; // 使用效果和上面的WithoutSvgSuffix完全一致 type KeyofWithoutSuffix = RemoveSuffix<keyof FooObj, 'Svg'>
内容的提问来源于stack exchange,提问作者Vencovsky
相关产品推荐
相关产品推荐

