You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:45:06