type-plus
Version:
Provides additional types for TypeScript.
72 lines (67 loc) • 1.65 kB
text/typescript
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>