type-challenges:Trunc

15 阅读1分钟

Trunc

问题描述

实现 typescript 版本的 Math.trunc,它接受字符串或数字,并通过删除任何小数位返回数字的整数部分。

type A = Trunc<12.34> // 12
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'type cases = [
  Expect<Equal<Trunc<0.1>, '0'>>,
  Expect<Equal<Trunc<0.2>, '0'>>,
  Expect<Equal<Trunc<1.234>, '1'>>,
  Expect<Equal<Trunc<12.345>, '12'>>,
  Expect<Equal<Trunc<-5.1>, '-5'>>,
  Expect<Equal<Trunc<'.3'>, '0'>>,
  Expect<Equal<Trunc<'1.234'>, '1'>>,
  Expect<Equal<Trunc<'-10.234'>, '-10'>>,
  Expect<Equal<Trunc<10>, '10'>>,
]
​
​
// ============= Your Code Here =============type Trunc<T extends string | number> = `${T}` extends `.${string}`
  ? '0'
  : `${T}` extends `${infer L}${'.'}${infer S}`
    ? L
    : `${T}`

这道题的逻辑是,首先约束泛型参数为数字或者字符串,其次需要将数字类型转为字符串类型,可以使用模板字符串的方式,也可以重新定义一个类型

type ToString<T extends string | number>=T extends string ? T : `${T}`

其次,需要先判断是否是小数点开头,这代表整数部分为 '0',使用模板字符串和 infer 关键字获取到小数点前的部分返回,如果没有小数点,则直接将当前泛型转为字符串后返回。