知识运用:
- 涉及到模板字符类型。
- 涉及到infer关键字使用。
题目分析:
题目地址:106-medium-trimleft
实现 TrimLeft<T>
,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串开头的空白字符串。
例如
type trimed = TrimLeft<' Hello World '> // 应推导出 'Hello World '
题目解答:
测试用例:
- 通过我们设计的类型工具将输入的类型处理为预期的类型。
- 分别需要处理空白字符、换行符、制表符三种。
/* _____________ 测试用例 _____________ */ import type { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect<Equal<TrimLeft<'str'>, 'str'>>, Expect<Equal<TrimLeft<' str'>, 'str'>>, Expect<Equal<TrimLeft<' str'>, 'str'>>, Expect<Equal<TrimLeft<' str '>, 'str '>>, Expect<Equal<TrimLeft<' \n\t foo bar '>, 'foo bar '>>, Expect<Equal<TrimLeft<''>, ''>>, Expect<Equal<TrimLeft<' \n\t'>, ''>>, ]
答案及解析:
- 通过观察测试用例我们得到需要Trim的内容包括空白字符、换行符、制表符。
- 通过条件类型来判断S是否可分配给包含上述三种内容的模板字符类型中来判断。
- 如果依旧可分配的话依旧使用TrimLeft递归去除来得到无法分配给上述三种内容的S。
- 在输入类型上我们依旧使用泛型约束输入类型为String。
/* _____________ 答案 _____________ */ type TrimLeft<S extends string> = S extends `${" " | "\n" | "\t"}${infer Rest}` ? TrimLeft<Rest> : S;