问题 #
实现 TrimLeft<T>
,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串开头的空白字符串。
例如
type trimed = TrimLeft<' Hello World '> // 应推导出 'Hello World '
解答 #
type TrimLeft<S extends string> = S extends `${' '| '\n'|'\t'}${infer R}` ? TrimLeft<R> : S
拆分 #
S
必须要为string
类型S
是否满足' '| '\n'|'\t'
开头- 因为实际上包含一个联合的字符串类型
- 所以因为联合类型会自动分配,所以实际上执行推断的时候会转化成
`${' '}${infer R}` ? TrimLeft<R> : S |
`${'\n'}${infer R}` ? TrimLeft<R> : S |
`${'\t'}${infer R}` ? TrimLeft<R> : S
- 最终经过递归处理左边的空白字符串,返回正确的推断