Skip to content

Trunc

约 294 字小于 1 分钟

2022-12-01

题目

Github: Trunc

实现 Math.trunc 的类型版本,该版本接受字符串或数字,并通过移除任何小数部分返回数字的整数部分。

type A = Trunc<12.34> // 12

解题思路

这个挑战很容易想到用 模板字面量类型 和 条件类型 infer 判断字符串是否包含小数部分,然后进行处理。

需要注意的是,数字字符串中可能包含 -,也可能省略整数部分的 0

答案

type Trunc<T extends number | string> = `${T}` extends `${infer D}.${string}`
  ? D extends '' | '-' ? `${D}0` : D
  : `${T}`

验证

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
<'-.3'>, '-0'>>,
Expect
<
Equal
<
Trunc
<'-10.234'>, '-10'>>,
Expect
<
Equal
<
Trunc
<10>, '10'>>,
]

参考