Sarcastic
Cast unknown values to typed values
- Asserts that a value matches the defined type
- Returns a typed value
- Copies the value for type safety
Install
yarn add sarcastic
Usage
const is = require('sarcastic');
const PKG_SHAPE = is.shape({
name: is.string,
version: is.string,
private: is.default(is.boolean, false),
scripts: is.maybe(is.objectOf(is.string)),
bin: is.maybe(is.either(is.string, is.arrayOf(is.string))),
});
let pkg = is(require('./package.json'), PKG_SHAPE);
With strict typing:
import is, { type AssertionType } from 'sarcastic';
const PKG_SHAPE = is.shape({
name: is.string,
version: is.string,
private: is.maybe(is.boolean),
scripts: is.maybe(is.objectOf(is.string)),
bin: is.maybe(is.either(is.string, is.arrayOf(is.string))),
});
type PkgShape = AssertionType<typeof PKG_SHAPE>;
function assertPkg(pkg: mixed): PkgShape {
return is(pkg, PKG_SHAPE, 'pkg');
}
let pkg = assertPkg(require('./package.json'));
API
is(val, assertion, name?)
is(true, is.boolean);
is(true, is.boolean, "example");
is.boolean
is(true, is.boolean);
is(false, is.boolean);
is(42, is.boolean);
is.number
is(42, is.number);
is(NaN, is.number);
is(true, is.number);
is.string
is("", is.string), "");
is("hi", is.string);
is(true, is.string);
is.array
is([], is.array);
is([1, 2, 3], is.array);
is({}, is.array);
is.func
is(() => {}, is.func);
is({}, is.func);
is(/regex/, is.func);
is.object
is({}, is.object);
is({ foo: true }, is.object);
is([], is.object);
is(null, is.object);
is.arrayOf(assertion)
is([], is.arrayOf(is.number));
is([1, 2, 3], is.arrayOf(is.number));
is({}, is.arrayOf(is.number));
is(["hi"], is.arrayOf(is.number));
is.arrayish(assertion)
is(1, is.arrayish(is.number));
is([], is.arrayish(is.number));
is([1, 2, 3], is.arrayish(is.number));
is("hi", is.arrayish(is.number));
is({}, is.arrayish(is.number));
is(["hi"], is.arrayish(is.number));
is.objectOf(assertion)
is({}, is.objectOf(is.boolean));
is({ foo: true }, is.objectOf(is.boolean));
is([], is.objectOf(is.boolean));
is(null, is.objectOf(is.boolean));
is({ foo: 42 }, is.objectOf(is.boolean));
is.shape({ [key: string]: assertion })
let myShape = is.shape({ foo: is.boolean });
is({ foo: true }, myShape);
is({ foo: true, bar: false }, myShape);
is([], myShape);
is(null, myShape);
is({ foo: 42 }, myShape);
is.maybe(assertion)
is(undefined, is.maybe(is.boolean));
is(null, is.maybe(is.boolean));
is(true, is.maybe(is.boolean));
is(42, is.maybe(is.boolean));
is.default(assertion, defaultValue)
is(undefined, is.default(is.number, 42));
is(null, is.default(is.number, 42));
is(3.14, is.default(is.number, 42));
is("hi", is.default(is.number, 42));
is.either(assertionA, assertionB)
is(true, is.either(is.boolean, is.string));
is("hi", is.either(is.boolean, is.string));
is(42, is.either(is.boolean, is.string));
is.AssertionError
try {
is(true, is.number);
} catch (err) {
if (err instanceof is.AssertionError) {
} else {
}
}
is.literal(stringLiteral)
is('a', is.literal('a'))
is(42, is.literal('a'))
With strict typing:
let literalAssetion = is.literal<'a'>('a');
import { type Assertion } from 'sarcastic';
let literalAssetion: Assertion<'a'> = is.literal('a');
is('a', literalAssetion)
is(42, is.literal<'a'>('a'))
is.literals(arrayOfStringLiterals)
let literalsAssertion = is.literals([
'a', 'b', 'c'
]);
is('a', literalsAssertion)
is('b', literalsAssertion)
is('c', literalsAssertion)
is(42, literalsAssertion)
With strict typing:
let literalsAssertion = is.literals<'a'|'b'|'c'>([
'a', 'b', 'c'
]);
import { type Assertion } from 'sarcastic';
let literalsAssertion: Assertion<'a'|'b'|'c'> = is.literals<'a'|'b'|'c'>([
'a', 'b', 'c'
]);
is('a', literalsAssertion)
is('b', literalsAssertion)
is('c', literalsAssertion)
is(42, literalsAssertion)