13、实现 Capitalize
题目内容
题目解析
涉及知识点: infer
这题只要拿到字符串的第一项,然后把他转换成大写的就可以了。
当然,前提需要判别是不是空字符串,如果是的,直接返回空字符串 ''。
题目答案
// ============= Your Code Here =============
type MyCapitalize<S extends string> = S extends `${infer First}${infer Rest}` ? `${Uppercase<First>}${Rest}`: ''
14、实现 Replace
题目内容
题目解析
涉及知识点: infer 、 extends
1、如果替换的元素From 是空字符串,直接返回原字符串;
2、如果字符串中不存在 From,也是直接返回原字符串;
3、如果字符串中有From字段,则直接把from部分替换成to,其他部分拼接成新字符串即可。
题目答案
// ============= Your Code Here =============
type Replace<S extends string, From extends string, To extends string> =
From extends '' ? S : S extends `${infer First}${From}${infer Last}` ? `${First}${To}${Last}` : S
15、实现 ReplaceAll
题目内容
题目解析
涉及知识点:infer 、 extends
这是上一题的升级版,前两个判别的条件都是一致的,只要最后不断遍历左边和右边,找出from字段,进行替换。
题目答案
type ReplaceAll<S extends string, From extends string, To extends string> =
From extends ''
? S :
S extends `${infer left}${From}${infer Right}`
? `${ReplaceAll<left, From, To>}${To}${ReplaceAll<Right, From, To>}` : S
16、实现 Append Argument
题目内容
题目解析
涉及知识点: infer
返回的函数结果类型不变,只需要增加入参的最后一项。
题目答案
// ============= Your Code Here =============
type AppendArgument<Fn extends Function, A> = Fn extends (...args: infer Args) => infer R ? (...args: [...Args, A]) => R
17、实现 Permutation
题目内容
type perm = Permutation<'A' | 'B' | 'C'>; // ['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
题目解析
涉及知识点: extends
官方文档中,介绍了一种操作,叫 Distributive conditional types。
简单来说,传入给T extends U中的T如果是一个联合类型A | B | C,则这个表达式会被展开成 (A extends U ? X : Y) | (B extends U ? X : Y) | (C extends U ? X : Y)
[U] extends [never] 而不是 U extends never 因为 U是联合类型 条件类型会走分配得到的是一个联合类型 不符合期望
题目答案
// ============= Your Code Here =============
type Permutation<T, U = T> = [U] extends [never] ? [] : (T extends U ? [T, ...Permutation<Exclude<U, T>>] : [])
18、实现 Length of String
题目内容
题目解析
涉及知识点: length
求的是字符串的长度,所以先把字符串转换成数组,然后根据数组的length属性求值。
题目答案
// ============= Your Code Here =============
type ToArray<T extends string> = T extends `${infer A}${infer B}`
? [A, ...ToArray<B>]
: [];
type LengthOfString<S extends string> = ToArray<S>['length'];
tips:
Medium级别的题目总共有75题,为了方便少量多次查看,缓解疲劳,我们就以6题为一篇进行。