UNPKG

@storm-stack/types

Version:

⚡ The storm-stack monorepo contains utility applications, tools, and various libraries to create modern and scalable web applications.

199 lines (198 loc) 5.29 kB
import { Not } from "./logic"; export type Numeric = number | bigint; export type Zero = 0 | 0n; /** * Matches the hidden `Infinity` type. * * Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277) if you want to have this type as a built-in in TypeScript. * * @see NegativeInfinity * * @category Numeric */ export type PositiveInfinity = 1e999; /** * Matches the hidden `-Infinity` type. * * Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277) if you want to have this type as a built-in in TypeScript. * * @see PositiveInfinity * * @category Numeric */ export type NegativeInfinity = -1e999; /** * A finite `number`. * You can't pass a `bigint` as they are already guaranteed to be finite. * * Use-case: Validating and documenting parameters. * * Note: This can't detect `NaN`, please upvote [this issue](https://github.com/microsoft/TypeScript/issues/28682) if you want to have this type as a built-in in TypeScript. * * @example * ``` * import type {Finite} from 'type-fest'; * * declare function setScore<T extends number>(length: Finite<T>): void; * ``` * * @category Numeric */ export type Finite<T extends number> = T extends PositiveInfinity | NegativeInfinity ? never : T; /** * A `number` that is an integer. * * Use-case: Validating and documenting parameters. * * @example * ``` * type Integer = Integer<1>; * //=> 1 * * type IntegerWithDecimal = Integer<1.0>; * //=> 1 * * type NegativeInteger = Integer<-1>; * //=> -1 * * type Float = Integer<1.5>; * //=> never * * // Supports non-decimal numbers * * type OctalInteger: Integer<0o10>; * //=> 0o10 * * type BinaryInteger: Integer<0b10>; * //=> 0b10 * * type HexadecimalInteger: Integer<0x10>; * //=> 0x10 * ``` * * @example * ``` * import type {Integer} from 'type-fest'; * * declare function setYear<T extends number>(length: Integer<T>): void; * ``` * * @see NegativeInteger * @see NonNegativeInteger * * @category Numeric */ export type Integer<T> = T extends unknown ? IsInteger<T> extends true ? T : never : never; export type IsInteger<T> = T extends bigint ? true : T extends number ? number extends T ? false : T extends PositiveInfinity | NegativeInfinity ? false : Not<IsFloat<T>> : false; export type IsFloat<T> = T extends number ? `${T}` extends `${infer _Sign extends "" | "-"}${number}.${infer Decimal extends number}` ? Decimal extends Zero ? false : true : false : false; /** * A `number` that is not an integer. * * Use-case: Validating and documenting parameters. * * It does not accept `Infinity`. * * @example * ``` * import type {Float} from 'type-fest'; * * declare function setPercentage<T extends number>(length: Float<T>): void; * ``` * * @see Integer * * @category Numeric */ export type Float<T> = T extends unknown ? IsFloat<T> extends true ? T : never : never; /** * A negative (`-∞ < x < 0`) `number` that is not an integer. * Equivalent to `Negative<Float<T>>`. * * Use-case: Validating and documenting parameters. * * @see Negative * @see Float * * @category Numeric */ export type NegativeFloat<T extends number> = Negative<Float<T>>; /** * A negative `number`/`bigint` (`-∞ < x < 0`) * * Use-case: Validating and documenting parameters. * * @see NegativeInteger * @see NonNegative * * @category Numeric */ export type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never; /** * A negative (`-∞ < x < 0`) `number` that is an integer. * Equivalent to `Negative<Integer<T>>`. * * You can't pass a `bigint` as they are already guaranteed to be integers, instead use `Negative<T>`. * * Use-case: Validating and documenting parameters. * * @see Negative * @see Integer * * @category Numeric */ export type NegativeInteger<T extends number> = Negative<Integer<T>>; /** * A non-negative `number`/`bigint` (`0 <= x < ∞`). * * Use-case: Validating and documenting parameters. * * @see NonNegativeInteger * @see Negative * * @example * ``` * import type {NonNegative} from 'type-fest'; * * declare function setLength<T extends number>(length: NonNegative<T>): void; * ``` * * @category Numeric */ export type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : never; /** * A non-negative (`0 <= x < ∞`) `number` that is an integer. * Equivalent to `NonNegative<Integer<T>>`. * * You can't pass a `bigint` as they are already guaranteed to be integers, instead use `NonNegative<T>`. * * Use-case: Validating and documenting parameters. * * @see NonNegative * @see Integer * * @example * ``` * import type {NonNegativeInteger} from 'type-fest'; * * declare function setLength<T extends number>(length: NonNegativeInteger<T>): void; * ``` * * @category Numeric */ export type NonNegativeInteger<T extends number> = NonNegative<Integer<T>>; /** * Returns a boolean for whether the given number is a negative number. * * @see Negative * * @example * ``` * import type {IsNegative} from 'type-fest'; * * type ShouldBeFalse = IsNegative<1>; * type ShouldBeTrue = IsNegative<-1>; * ``` * * @category Numeric */ export type IsNegative<T extends Numeric> = T extends Negative<T> ? true : false;