知识运用:
- 涉及到模板字符类型。
- 涉及到infer关键字使用。
题目分析:
题目地址:4803 - Trim Right
实现 TrimRight<T>
,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串结尾的空白字符串。
例如
type Trimed = TrimLeft<' Hello World '> // 应推导出 ' Hello World' 复制代码
题目解答:
测试用例:
- 通过我们设计的类型工具将输入的类型处理为预期的类型。
- 分别需要处理空白字符、换行符、制表符三种。
/* _____________ 测试用例 _____________ */ import type { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect<Equal<TrimRight<'str'>, 'str'>>, Expect<Equal<TrimRight<'str '>, 'str'>>, Expect<Equal<TrimRight<'str '>, 'str'>>, Expect<Equal<TrimRight<' str '>, ' str'>>, Expect<Equal<TrimRight<' foo bar \n\t '>, ' foo bar'>>, Expect<Equal<TrimRight<''>, ''>>, Expect<Equal<TrimRight<'\n\t '>, ''>>, ]
答案及解析:
我相信看过上一题的处理的伙伴已经知道这道题怎么做了,我们还是再来过一遍做题思路。
- 老套路,使用泛型来约定输入类型为String。
- 使用条件类型来判断S是否可以分配给包含测试用例提到的三种类型在模板字符串右边的类型。
- 如果依旧可分配还是使用TrimRight进行递归处理,指到无法分配后返回类型S,及完成了TrimRight的功能。
type TrimRight<S extends string> = S extends `${infer Rest}${" " | "\n" | "\t"}` ? TrimRight<Rest> : S;