UNPKG

@kakasoo/proto-typescript

Version:

Utility types and implementations based on JavaScript prototypes.

33 lines 2.9 kB
import { ArrayType, NNTuple, NTuple } from './array.type'; import { ReadonlyOrNot } from './primitive.type'; import { RegExpType } from './regexp.type'; import { StringType } from './string.type'; export declare namespace NumberType { /** * @todo Math.round type needed. */ type ToFixed<N extends number, Length extends ArrayType.Values<LessThan<21>> = 0> = `${StringType.InsertedInteger<N>}.${StringType.PadEnd<`${ArrayType.Join<StringType.Split<`${StringType.InsertedFractional<N>}`, '', Length>, ''>}`, Length, '0'>}`; type NToNumber<N> = N extends number ? N : never; type NToNumberTuple<N> = N extends number[] ? N : never; type Digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; type Add<N1 extends number, N2 extends number> = [...NTuple<N1>, ...NTuple<N2>] extends [...infer U] ? ArrayType.Length<U> : never; type Sub<A extends number, B extends number> = NTuple<A> extends [...infer U, ...NTuple<B>] ? ArrayType.Length<U> : never; type IsDigit<T extends string> = ArrayType.Includes<Digits, T>; type NumberString<T extends number> = `${T}`; type LessThan<N extends number, T extends any[] = []> = T['length'] extends N ? T : LessThan<N, ArrayType.Push<T, T['length']>>; type Compare<N1 extends number, Operator extends '>' | '<' | '>=' | '<=' | '=', N2 extends number> = Operator extends '>=' ? N1 extends N2 ? true : [NumberType.Sub<N1, N2>] extends [never] ? false : true : Operator extends '<=' ? N1 extends N2 ? true : [NumberType.Sub<N2, N1>] extends [never] ? false : true : Operator extends '>' ? N1 extends N2 ? false : [NumberType.Sub<N1, N2>] extends [never] ? false : true : Operator extends '<' ? N1 extends N2 ? false : [NumberType.Sub<N2, N1>] extends [never] ? false : true : Operator extends '=' ? N1 extends N2 ? true : false : never; type LessThanEqual<N extends number, T extends any[] = []> = LessThan<NToNumber<Add<N, 1>>>; type GaussSum<N1 extends number, K = ArrayType.Values<LessThanEqual<N1>>> = K extends number ? NTuple<K> : never; type Multiply<T1 extends number, T2 extends number> = ArrayType.Length<NNTuple<T1, T2>>; type Divide<T extends number, N extends number, Answer extends number = 0> = NTuple<T> extends [ ...NTuple<N>, ...infer Rest ] ? Divide<ArrayType.Length<Rest>, N, NToNumber<Add<Answer, 1>>> : Answer; type Remainder<T extends number, N extends number> = Sub<T, NToNumber<Multiply<N, Divide<T, N>>>>; /** * 수의 절대값을 추론하는 타입 */ type Absolute<T extends number | string | bigint> = `${T}` extends `-${infer R}` ? R : `${T}`; type Range<T extends RegExpType.Range<number, number>> = T extends RegExpType.Range<infer From, infer To> ? ReadonlyOrNot<Exclude<ArrayType.Values<NumberType.LessThanEqual<To>>, ArrayType.Values<NumberType.LessThan<From>>>[]> : never; } //# sourceMappingURL=number.type.d.ts.map