Trim

挑战

实现Trim<T>,它接受一个明确的字符串类型,并返回一个新字符串,其中两端的空白符都已被删除。

例如

type trimed = Trim<'  Hello World  '>; // expected to be 'Hello World'

解答

这道题最简单粗暴的方式,直接在上一题 TrimLeft 的基础上,再加一步 TrimRight 就可以了。

type TrimLeft<S extends string> = S extends `${Space}${infer Rest}`
  ? TrimLeft<Rest>
  : S;
 
type TrimRight<S extends string> = S extends `${infer Rest}${Space}`
  ? TrimRight<Rest>
  : S;
 
type Trim<S extends string> = TrimRight<TrimLeft<S>>;

但我们可以把这个实现优化一下,通过使用联合类型模式匹配来同时处理字符串两端的空白符,从而减少递归次数,提高效率。

type Trim<S extends string> = S extends
  | `${Space}${infer Rest}`
  | `${infer Rest}${Space}`
  ? Trim<Rest>
  : S;

参考链接