Drop Char
挑战
从字符串中剔除指定字符。
例如:
type Butterfly = DropChar<" b u t t e r f l y ! ", " ">; // 'butterfly!'
解答
为了解决这个问题,我们需要了解模板字面量类型。你可以
在TypeScript Handbook
中了解更多。
使用模板字面量类型时,我们可以从字符串中推断所需的部分,并检查其是否是我们期望的 部分。让我们从最简单的情况开始 - 推断字符串的左侧部分和右侧部分。它们之间的分隔 符是所需的字符本身。
type DropChar<S, C> = S extends `${infer L}${C}${infer R}` ? never : never;
使用这样的表示方法,我们会得到一个编译错
误Type ‘C’ is not assignable to type ‘string | number | bigint | boolean | null | undefined’.
添
加一个泛型约束去修复它。
type DropChar<S, C extends string> = S extends `${infer L}${C}${infer R}`
? never
: never;
现在我们有了左右两部分以及字符C
。由于我们需要删除C
,因此我们返回没有它的左右
部分。
type DropChar<S, C extends string> = S extends `${infer L}${C}${infer R}`
? `${L}${R}`
: never;
这样我们就将目标字符从字符串中剔除了,为了删除其他部分含有的目标字符,我们需要递 归地调用该类型。
type DropChar<S, C extends string> = S extends `${infer L}${C}${infer R}`
? DropChar<`${L}${R}`, C>
: never;
我们涵盖了所有的情况,除了要剔除的目标字符串为空, 这时我们将整个字符串返回即可。
type DropChar<S, C extends string> = S extends `${infer L}${C}${infer R}`
? DropChar<`${L}${R}`, C>
: S;
评论