【Typescript】type-challenges:medium级别题目(三)

86 阅读2分钟

image.png

13、实现 Capitalize

题目内容

1682922912945.png

题目解析

涉及知识点: infer

这题只要拿到字符串的第一项,然后把他转换成大写的就可以了。

当然,前提需要判别是不是空字符串,如果是的,直接返回空字符串 ''。

题目答案
// ============= Your Code Here =============
type MyCapitalize<S extends string> = S extends `${infer First}${infer Rest}` ? `${Uppercase<First>}${Rest}`: ''

14、实现 Replace

题目内容

1682923463530.png

题目解析

涉及知识点: 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

题目内容

1682924625752.png

题目解析

涉及知识点: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

题目内容

1682926446034.png

题目解析

涉及知识点: infer

返回的函数结果类型不变,只需要增加入参的最后一项。

题目答案
    // ============= Your Code Here =============
    type AppendArgument<Fn extends Function, A> = Fn extends (...args: infer Args) => infer R ? (...args: [...Args, A]) => R

17、实现 Permutation

题目内容

1682926850281.png

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

题目内容

1682927126866.png

题目解析

涉及知识点: 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题为一篇进行。