[TypeScript] Type Challenges #529 - Absolute

35 阅读1分钟

题目描述

实现一个接收string,number或bigInt类型参数的Absolute类型,返回一个正数字符串。

例如

type Test = -100;
type Result = Absolute<Test>; // expected to be "100"

题解

// ============= Test Cases =============
import type { Equal, Expect } from './test-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'>>,
]


// ============= Your Code Here =============
type Absolute<T extends number | string | bigint> =
  `${T}` extends `-${infer U}`
    ? U
    : `${T}`;

类型约束

使用T extends number | string | bigint对类型T进行约束,确保Tnumberstringbigint类型

条件类型

type Absolute<T extends number | string | bigint> =
  `${T}` extends `-${infer U}`
    ? U
    : `${T}`;
  • T转换为字符串:

    • ${T}:将T转换为字符串
  • 条件判断:

    • ${T} extends -${infer U}

      • 如果${T}是一个负数字符串(以-号开头),则将-号后面的内容推断为类型U

      • 返回U

    • 否则,返回${T}