TypeScript类型体操挑战(二十)

63 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

中等

Trim Right(删除结尾空白符)

挑战要求

在线示例

type Space = ' ' | '\n' | '\t';

type TrimRight<S extends string> = S extends `${infer R}${Space}` ? TrimRight<R> : S;


// 使用示例
type Trimed = TrimLeft<'  Hello World  '> // 应推导出 '  Hello World'

Trim Left 的逻辑是一样的

使用模板字符串来匹配S,从而将尾部符合Space类型的字符串一个个地干掉。

去除数组指定元素(lodash.without())

挑战要求

在线示例

type ValueOf<T> = T extends [...any] ? T[number] : T;

type Without<T, U extends number[] | number> = 
  T extends [infer F, ...infer E]
    ? F extends ValueOf<U>
      ? [...Without<E, U>]
      : [F, ...Without<E, U>]
  : T;



// 使用示例
type Res = Without<[1, 2], 1>; // expected to be [2]
type Res1 = Without<[1, 2, 4, 1, 5], [1, 2]>; // expected to be [4, 5]
  1. 迭代数组T,对元素F进行处理,符合条件就保留,否则丢弃
  2. 然后调用Without继续处理下一个元素,知道迭代完毕

解答思路如图:

Trunc (Math.trunc())

挑战要求

在线示例

type Trunc<S extends string | number> = 
  `${S}` extends `${infer F}.${string}`
  ? F
  : `${S}`;



// 使用示例
type A = Trunc<12.34> // '12'
type B = Trunc<'1.234'> // '1'
  1. 先将S转为字符串类型
  2. 利用模板字符串的特性完成小数匹配
  3. 根据判断条件返回对应的字符串即可