typeok

A tiny type-checking utility.

import typecheck from 'typeok';

typecheck({ numbers: [1, 2, 'notanumber'], string: 'typeok' });
// { ok: false, errors: [TypeError: Expected number, got: 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 export name is typeok.

Browser (ESM)

<script type="module">
  import typecheck from 'https://unpkg.com/typeok/dist/typeok.js';
</script>

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, got: []] }

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, got: []] }

It may get tedious passing the same overrides every single time you need to check your variables. A simple way around this is wrapping 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, got: 20] }

Credits

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