TypeScript Trim工具类型的正确实现方式与写法优化思路
正确的Trim工具类型实现及优化说明
原实现的问题
你写的Trim类型核心问题是模式匹配命中了字符串任意位置的空格,只要字符串中存在空格就会被删除,自然不符合Trim仅移除首尾空格的语义。同时你枚举了多种空格位置的分支,不仅逻辑冗余,也无法覆盖所有首尾空格的场景(比如开头连续3个以上空格的情况就会匹配失败,导致空格删不干净)。
规范实现
我们可以拆分逻辑,先分别实现移除开头空格的TrimLeft和移除结尾空格的TrimRight,再组合得到Trim:
// 移除开头所有空格 type TrimLeft<T extends string> = T extends ` ${infer Rest}` ? TrimLeft<Rest> : T; // 移除结尾所有空格 type TrimRight<T extends string> = T extends `${infer Rest} ` ? TrimRight<Rest> : T; // 组合实现Trim,先去尾空格再去头空格即可 type Trim<T extends string> = TrimLeft<TrimRight<T>>;
如果你想写在同一个类型里也可以,逻辑完全一致:
type Trim<T extends string> = T extends ` ${infer Rest}` ? Trim<Rest> : T extends `${infer Rest} ` ? Trim<Rest> : T;
测试用例验证
用你的测试用例运行结果如下,完全符合预期:
type TestOne = Trim<" foo"> ; // 类型为 "foo" type TestTwo = Trim< " foo "> ; // 类型为 "foo" type TestThree = Trim<" foo bar "> ; // 类型为 "foo bar",中间空格保留 type TestFour = Trim<" foo bar "> ; // 类型为 "foo bar",多个开头空格也能完全移除 type TestFive = Trim<"foo bar ">; // 类型为 "foo bar"
对比原实现的优化点
- 语义准确:仅匹配首尾位置的空格,中间空格完全保留,符合标准Trim语义
- 逻辑简洁:不需要枚举各种空格位置的分支,递归逻辑通用,不管首尾有多少个空格都能完全移除
- 性能更优:递归次数仅和首尾空格的数量相关,和字符串整体长度无关,结合TS 4.5的条件类型尾递归消除特性,处理长字符串也不会触发递归深度限制报错
- 复用性高:拆分出来的
TrimLeft和TrimRight可以作为独立工具类型单独使用,符合类型工具的拆分原则
内容的提问来源于stack exchange,提问作者0.sh
相关产品推荐
相关产品推荐

