@kakasoo/proto-typescript
Version:
Utility types and implementations based on JavaScript prototypes.
33 lines • 2.9 kB
TypeScript
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