# @wistia/type-guards

> Runtime type guards and utility types for TypeScript. Every guard is a `value is T` predicate that narrows `unknown` values; every type is a small composable building block.

## Install

```sh
npm install @wistia/type-guards
yarn add @wistia/type-guards
pnpm add @wistia/type-guards
```

## Import

```ts
import { isString, isNotNil, type Nilable } from '@wistia/type-guards';
```

## Guards

<!-- AUTOGEN:LLMS-GUARDS:START -->
Primitives:

- `isBoolean(value)` — `value is boolean`
- `isDate(value)` — `value is Date`
- `isError(value)` — `value is Error`
- `isFunction(value)` — `value is (...args: unknown[]) => unknown`
- `isInteger(value)` — `value is number`
- `isNaN(value)` — `value is number`
- `isNil(value)` — `value is Nil`
- `isNull(value)` — `value is null`
- `isNumber(value)` — `value is number`
- `isString(value)` — `value is string`
- `isUndefined(value)` — `value is undefined`
- `isVoid(value)` — `value is void`

Arrays:

- `isArray(value)` — `value is unknown[]`
- `isEmptyArray(value)` — `value is never[]`
- `isNonEmptyArray(value)` — `value is NonEmptyArray<T>`

Records (plain objects, not arrays):

- `hasKey(value, key)` — `value is Record<Key, Value>`
- `isEmptyRecord(value)` — `value is EmptyObject`
- `isNonEmptyRecord(value)` — `value is Record<string, unknown>`
- `isRecord(value)` — `value is EmptyObject | Record<string, unknown>`

Strings:

- `isEmptyString(value)` — `value is ''`
- `isNonEmptyString(value)` — `value is string`

Truthy / falsy:

- `isFalsy(value)` — `value is Falsy`
- `isTruthy(value)` — returns `boolean`

Negated:

- `isNotArray(value)` — `value is Exclude<unknown, unknown[]>`
- `isNotBoolean(value)` — `value is Exclude<unknown, boolean>`
- `isNotFunction(value)` — `value is Exclude<unknown, (...args: unknown[]) => unknown>`
- `isNotNil(value)` — `value is T`
- `isNotNull(value)` — `value is Exclude<T, null>`
- `isNotNumber(value)` — `value is Exclude<unknown, number>`
- `isNotRecord(value)` — `value is Exclude<unknown, EmptyObject | Record<string, unknown>>`
- `isNotString(value)` — `value is Exclude<unknown, string>`
- `isNotUndefined(value)` — `value is Exclude<T, undefined>`
- `isNotVoid(value)` — `value is Exclude<unknown, void>`
<!-- AUTOGEN:LLMS-GUARDS:END -->

## Types

<!-- AUTOGEN:LLMS-TYPES:START -->
- `Arrayable<T>` — `T | T[]`
- `Falsy` — `typeof Number.NaN | '' | 0n | false | null | undefined`
- `NestedNonNullable<T, P extends Paths<T> & string>` — `NonNullable<Get<T, P>>`
- `Nil` — `null | undefined`
- `Nilable<A>` — `A | Nil`
- `NilableArray<T>` — `Nilable<Nilable<T>[]>`
- `NonEmptyArray<T>` — `[T, ...T[]]`
- `NotNilable<A>` — `Exclude<A, Nil>`
- `Nullable<A>` — `A | null`
- `NullableProperties<T extends UnknownRecord>` — `{ [Key in keyof T]: Nullable<T[Key]> }`
- `Truthy<T>` — `Exclude<T, Falsy>`
- `Undefinable<A>` — `A | undefined`
<!-- AUTOGEN:LLMS-TYPES:END -->

## See also

- `llms-full.txt` — every export with signature and example, in a single document
- `README.md` — human-readable docs
- `dist/index.d.mts` — typed entry point with full TSDoc on every export
