Typescript 숫자 리터럴 유형 X^N 방법(지수화)

이번 포스트에서는 x를 n의 거듭제곱으로 올리려고 합니다.

x와 n은 모두 숫자 리터럴 유형입니다.

이렇게 하려면 약간 수정하여 활용해야 합니다.

type CreateArrayWithLengthX<
    LENGTH extends number,
    ACC extends unknown[] = [],
> = ACC['length'] extends LENGTH
    ? ACC
    : CreateArrayWithLengthX<LENGTH, [...ACC,1]>

type Multiplication<X extends number, Y extends number, Z extends number[] = [], V extends unknown[] = []> = 
    [...CreateArrayWithLengthX<Y>]['length'] extends Z['length']
    ? V // modified
    : Multiplication<X,Y,[1,...Z],[...CreateArrayWithLengthX<X>,...V]>


좋아, 이제 빌딩 블록이 생겼으니 해보자

type Exponentiation<X extends number, N extends number, Counter extends number[] =[], Acc extends unknown[] = [1]> =
    Counter['length'] extends N 
        ? Acc['length'] 
        : Exponentiation<X, N, [1, ...Counter], Multiplication<Acc['length'],X> >

type A = Exponentiation<2,0> // 1
type B = Exponentiation<2,1> // 2
type C = Exponentiation<2,10> // 1024
type D = Exponentiation<3,7> // 2187
type E = Exponentiation<21,3> // 9261


playground

제한: 최대 튜플 크기가 9999이므로 결과는 9999를 초과할 수 없습니다.

x의 값에 따라 n에 대한 제한도 있습니다.
x가 2이면 n은 10을 초과할 수 없습니다(2¹⁰는 2가 1000을 초과하는 최초의 지수입니다).

x가 3이면 n은 7을 초과할 수 없습니다(3⁷은 3의 지수가 처음으로 1000을 초과함)

이 시점에서 x^n은 1000보다 크고 최대 재귀 깊이가 1000이기 때문에 다음 n에 대해 길이가 1000보다 큰 배열을 만들 수 없습니다.

좋은 웹페이지 즐겨찾기