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
    : 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 // modified 
        : Exponentiation<X, N, [1, ...Counter], Multiplication<Acc['length'],X> >


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

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

type A = Root<4,2> // 2
type B = Root<8,3> // 2
type C = Root<81,4> // 3
type D = Root<625,4> // 5
type E = Root<1024,10> // 2
type F = Root<2187,7> // 3
type G = Root<9261,3> // 21


playground

제한: X와 N은 양의 정수여야 하며 양의 정수 루트에서만 작동합니다. 최대 튜플 크기가 9,999이므로 X는 9,999를 초과할 수 없습니다.

result^(N-1)이 1000보다 작은 경우 X는 999를 초과할 수 있습니다.

경고, 입력을 하나씩 삽입하지 않으면 놀이터가 깨질 것입니다.

좋은 웹페이지 즐겨찾기