В этом посте мы попытаемся возвести 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
"детская площадка"
ограничение: результат не может превышать 9999, так как максимальный размер кортежа равен 9999
также существует некоторое ограничение на n, зависящее от значения x
если x равно 2, то n не может превышать 10 (2¹⁰ — это первое экспоненциальное значение 2, превышающее 1000)
если x равно 3, то n не может превышать 7 (3⁷ - это первое экспоненциальное число 3, превышающее 1000)
на данный момент x ^ n больше 1000, и невозможно создать массив с длиной больше 1000 для следующего n, потому что максимальная глубина рекурсии составляет всего 1000