joobang/type-challenges

no - 10969 - Integer

Closed this issue · 1 comments

type Integer<T extends number> = `${T}` extends `${bigint}` ? T : never
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

let x = 1
let y = 1 as const

type cases1 = [
  Expect<Equal<Integer<1>, 1>>,
  Expect<Equal<Integer<1.1>, never>>,
  Expect<Equal<Integer<1.0>, 1>>,
  Expect<Equal<Integer<1.000000000>, 1>>,
  Expect<Equal<Integer<0.5>, never>>,
  Expect<Equal<Integer<28.00>, 28>>,
  Expect<Equal<Integer<28.101>, never>>,
  Expect<Equal<Integer<typeof x>, never>>,
  Expect<Equal<Integer<typeof y>, 1>>,
]

동작 방식

  1. 템플릿 리터럴 타입 사용:

    • \${T}`: 숫자 T를 문자열로 변환합니다. 예를 들어, T123이라면 `${T}`"123"`이 됩니다.
    • \${bigint}`: bigint타입의 값을 문자열로 변환한 결과와 비교합니다.bigint`는 큰 정수 타입으로, 정수만을 표현할 수 있습니다.
  2. 조건부 타입:

    • \${T}` extends `${bigint}`: 숫자 T가 정수라면, 이를 문자열로 변환한 결과는 bigint와 같은 형태가 됩니다. 예를 들어, 123"123"이고, 이는 bigint`의 문자열 표현과 일치합니다.
    • 그렇지 않다면, T는 소수일 가능성이 있습니다. 예를 들어 123.45를 문자열로 변환하면 "123.45"가 되며, 이는 \${bigint}``와 일치하지 않습니다.
  3. 결과 타입 결정:

    • 조건이 참이면 T를 반환하고, 거짓이면 never를 반환합니다.

예제

type A = Integer<123>;    // 123 (정수이므로 그대로 반환)
type B = Integer<123.45>; // never (소수이므로 never 반환)
type C = Integer<-50>;    // -50 (정수이므로 그대로 반환)
type D = Integer<0>;      // 0 (정수이므로 그대로 반환)

요약

  • Integer<T>는 숫자 T가 정수인 경우 T를 반환하고, 그렇지 않으면 never를 반환하는 유틸리티 타입입니다.
  • 이 타입은 정수를 구분하기 위해 템플릿 리터럴과 bigint 타입의 특성을 활용합니다.