Skip to main content
The Deno 2 Release Candidate is here
Learn more

typeok

A tiny type-checking utility.

import typecheck from 'typeok';

typecheck({ numbers: [1, 2, 'notanumber'], string: 'typeok' });
// { ok: false, errors: [TypeError: Expected number but got string: "notanumber"] }

Install

Node

npm install typeok

Deno

import typecheck from 'https://deno.land/x/typeok/index.js';

Browser

<script src="https://unpkg.com/typeok/dist/typeok.min.js"></script>

In the browser context, the default function name is typeok.

Try in Flems.

Usage

Pass an object to the typecheck function where the given keys correspond to the types, and the values are the variables you’d like to typecheck. Simply append an s to a key string when you’d like to typecheck multiple variables of the same type, for example, strings or objects. Unrecognized types are ignored.

typeok returns an object, { ok: boolean, errors: TypeError[] } for every check.

typecheck({
    object: {},
    number: 1,
    strings: ['one', 'two'],
    arrays: [[1, 2], ['mixed', {}, null]]
});

// { ok: true, errors: [] }

typeok uses regular typeof checks under the hood, and never throws. You can use the built-in typecheckers or provide your own. The built-in typecheckers include checks for:

  • number
  • array
  • boolean
  • object
  • string
  • function
  • defined

(Note: [] will pass the built-in object check).

Type Map Override

You can pass an object as a second argument to override or extend the built-in typecheckers.

typecheck({ object: [] }, { object: x => typeof x === 'object' && !Array.isArray(x) });
// { ok: false, errors: [TypeError: Expected object but got object: []] }

You may want to piggyback on the built-in typecheckers in your own custom typecheckers, in which case, the built-in type-map is provided as a second argument for all typecheckers:

typecheck({ object: [] }, { object: (x, is) => is.object(x) && !Array.isArray(x) });
// { ok: false, errors: [TypeError: Expected object but got object: []] }

It may get tedious passing the same overrides every single time you need to check your variables, in which case, you can easily wrap the default typeok function:

import typeok from 'typeok';

const overrides = { MinimumAge: (x, is) => is.number(x) && x >= 21 };
const typecheck = obj => typeok(obj, overrides);

typecheck({ MinimumAge: 20 });
// { ok: false, errors: [TypeError: Expected MinimumAge but got number: 20] }

Credits

Check out jty by Alex Ewerlöf, which was the original inspiration for this utility.