Skip to main content

primitive

Primitive, Falsy, Truthy, Builtin, NonNullish — and IsOptional / IsNullable.

import type {
  Primitive, Falsy, Truthy,
  Nullish, NonNullish, Nullable, Maybe,
  Builtin, NonPrimitive,
  IsPrimitive, IsOptional, IsNullable,
  Arrayable, MultidimensionalArray,
} from '@gentleduck/ttest/primitive'

Primitive

type Primitive = string | number | boolean | bigint | symbol | null | undefined

Every JavaScript primitive.

Falsy / Truthy

type Falsy     = '' | 0 | 0n | false | null | undefined
type Truthy<T> = Exclude<T, Falsy>
type T = Truthy<string | null>  // string  (but '' is allowed at runtime — Truthy excludes only the literal '')

Nullish / NonNullish / Nullable / Maybe

type Nullish      = null | undefined
type NonNullish<T> = Exclude<T, Nullish>
type Nullable<T>  = T | null
type Maybe<T>     = T | null | undefined

Builtin

type Builtin =
  | Primitive
  | Date | Error | RegExp | ArrayBuffer | DataView
  | Map<unknown, unknown> | Set<unknown>
  | WeakMap<WeakKey, unknown> | WeakSet<WeakKey>
  | Promise<unknown>
  | Function

The recursion stop-set used by DeepPartial, DeepReadonly, etc. — types where "go deeper" doesn't make sense.

NonPrimitive

type NonPrimitive = Exclude<{}, Primitive>

Anything that is not a primitive — objects, arrays, functions, class instances.

IsPrimitive

type IsPrimitive<T> = T extends Primitive ? true : false

Arrayable / MultidimensionalArray

type Arrayable<T>              = T | readonly T[]
type MultidimensionalArray<T>  = T | ReadonlyArray<MultidimensionalArray<T>>

Arrayable is the common "T or T[]" pattern. MultidimensionalArray is its recursive cousin — T | T[] | T[][] | ....

IsOptional

type IsOptional<T> = undefined extends T ? true : false

true if T includes undefined.

IsNullable

type IsNullable<T> = null extends T ? true : undefined extends T ? true : false

true if T includes null or undefined. The SQL-level counterpart is IsSQLNullable.