UNPKG

type-plus

Version:
72 lines (67 loc) 1.65 kB
import type { IsNever } from '../never/never_type.js' import type { StrictNumberType } from '../number/strict_number_type.js' /** * 🌪️ *filter* * * Filter `T` to ensure it is an array, excluding tuple. * * @example * ```ts * type R = ArrayType<number[]> // number[] * * type R = ArrayType<[1]> // never * type R = ArrayType<number[] | 1> // never * type R = ArrayType<number[] & { a: 1 }> // never * ``` */ export type ArrayType<T, Then = T, Else = never> = IsNever< T, Else, [any[]] extends [T] ? ([T] extends [any[]] ? StrictNumberType<T['length'], Then, Else> : Else) : Else > /** * 🎭 *validate* * * Validate that `T` is an array, excluding tuple. * * @example * ```ts * type R = IsArray<number[]> // true * * type R = IsArray<number> // false * type R = IsArray<[1]> // false * ``` */ export type IsArray<T, Then = true, Else = false> = ArrayType<T, Then, Else> /** * 🌪️ *filter* * * Filter `T` to ensure it is not an array, excluding tuple. * * i.e. *tuple* will pass through this filter. * * @example * ```ts * type R = NotArrayType<number[]> // never * * type R = NotArrayType<number> // number * type R = NotArrayType<[1]> // [1] * ``` */ export type NotArrayType<T, Then = T, Else = never> = ArrayType<T, Else, Then> /** * 🎭 *validate* * * Validate that `T` is not an array, excluding tuple. * * i.e. *tuple* will pass through this filter. * * @example * ```ts * type R = IsNotArray<number[]> // false * * type R = IsNotArray<number> // true * type R = IsNotArray<[1]> // true * ``` */ export type IsNotArray<T, Then = true, Else = false> = ArrayType<T, Else, Then>