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>
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.