Absolute

for typehero

case:

type Absolute<T extends number | string | bigint> = any
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Absolute<0>, '0'>>,
  Expect<Equal<Absolute<-0>, '0'>>,
  Expect<Equal<Absolute<10>, '10'>>,
  Expect<Equal<Absolute<-5>, '5'>>,
  Expect<Equal<Absolute<'0'>, '0'>>,
  Expect<Equal<Absolute<'-0'>, '0'>>,
  Expect<Equal<Absolute<'10'>, '10'>>,
  Expect<Equal<Absolute<'-5'>, '5'>>,
  Expect<Equal<Absolute<-1_000_000n>, '1000000'>>,
  Expect<Equal<Absolute<9_999n>, '9999'>>,
]

思路:

前提:

  • 数字字面量可以包含下划线 _作为分隔符,用来提升代码的可读性。这一特性在 ES2021(或者 TypeScript 2.7+)被引入。当通过模版字符串或其他方式转为字符串时,下划线会被忽略。其中数字后面的n表示bigint类型。
const a = 1_000_000
`${a}` // 1000000
console.log(a) // 1000000 log转为字符串

在ts的类型当中同样存在类似的模版字符类型

回到本题,希望将一些可以转为数字的类型转为字符串,然后去掉负号。 那么直接判断其是否为负数,如果是的话,去掉负号,否则直接转为字符串。

type Absolute<T extends number | string | bigint> = T extends `-${infer P}` ? P : `${T}`

但忽略了T是一个负的整数的情况,这时候需要直接将其转为字符串然后再判断

type Absolute<T extends number | string | bigint> = `${T}` extends `-${infer P}` ? P : `${T}`

评论

加载中…

    ← 返回 Leetcode