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
关键字获取到小数点前的部分返回,如果没有小数点,则直接将当前泛型转为字符串后返回。