If you use this repo, star it β¨
π» Comprehensive collection of type assertions for JavaScript and TypeScript
Forked from @sniptt/guards
Zero dependencies πͺ
npm install @tjmgregory/assertsimport { ... } from 'https://deno.land/x/asserts/mod.ts'
// TODO@sniptt/guards allows you to infer your types via if statements.
asserts enables this same type inference, but without if statements, instead by informing the compiler that we will throw if this value is not of this type, so you know for certain that it is.
The latest ECMAScript standard defines nine types:
- Six Data Types that are primitives, checked by
typeofoperator:undefined:typeof instance === "undefined"Boolean:typeof instance === "boolean"Number:typeof instance === "number"String:typeof instance === "string"BigInt:typeof instance === "bigint"Symbol:typeof instance === "symbol"
- Structural Types:
Object:typeof instance === "object". Special non-data but structural type for any constructed object instance also used as data structures: newObject, newArray, newMap, newSet, newWeakMap, newWeakSet, newDateand almost everything made withnewkeyword;Functionnon data structure, though it also answers fortypeofoperator:typeof instance === "function". This answer is done as a special shorthand forFunctions, though everyFunctionconstructor is derived fromObjectconstructor.
- Structural Root Primitive
null:typeof instance === "object". Special primitive type having additional usage for it's value: if object is not inherited, thennullis shown;
Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Sample usage:
import { primitives } from '@tjmgregory/asserts';
primitives.isNumber(val);or
import { isNumber } from '@tjmgregory/asserts';
isNumber(val);import { isBigInt } from '@tjmgregory/asserts';
let val: bigint | number;
function wantsABigint(foo: bigint) {}
isBigInt(val);
// TypeScript will infer val is now a bigint, else it would have thrown
wantsABigint(val); // Compilesimport { isBoolean } from '@tjmgregory/asserts';
let val: boolean | number;
function wantsABoolean(foo: boolean) {}
isBoolean(val);
// TypeScript will infer val is now a boolean, else it would have thrown
wantsABoolean(val); // CompilesThrows for NaN!
See also:
import { isNumber } from '@tjmgregory/asserts';
let val: number | string;
function wantsANumber(foo: number) {}
isNumber(val);
// TypeScript will infer val is now a number, else it would have thrown
wantsANumber(val); // Compilesimport { isString } from '@tjmgregory/asserts';
let val: string | number;
function wantsAString(foo: string) {}
isString(val);
// TypeScript will infer val is now a string, else it would have thrown
wantsAString(val); // Compilesimport { isSymbol } from '@tjmgregory/asserts';
let val: symbol | string;
function wantsASymbol(foo: symbol) {}
isSymbol(val);
// TypeScript will infer val is now a symbol, else it would have thrown
wantsASymbol(val); // Compilesimport { isUndefined } from '@tjmgregory/asserts';
let val: undefined | null;
function wantsUndefined(foo: undefined) {}
isUndefined(val);
// TypeScript will infer val is now a undefined, else it would have thrown
wantsUndefined(val); // CompilesSample usage:
import { structural } from '@tjmgregory/asserts';
structural.isMap(val);or
import { isMap } from '@tjmgregory/asserts';
isMap(val);Answers true if and only if value === null.
Answers true if and only if typeof value === "function".
Answers false to null!
To check for array:
isArray(term);To check for object or null:
isObjectOrNull(term);Throws if and only if Array.isArray(value) !== true.
Throws if and only if (value instanceof Map) !== true.
Throws if and only if (value instanceof Set) !== true.
Throws if and only if (value instanceof WeakMap) !== true.
Throws if and only if (value instanceof WeakSet) !== true.
Throws if and only if (value instanceof Date) !== true.
Sample usage:
import { convenience } from '@tjmgregory/asserts';
convenience.isNonEmptyArray(val);or
import { isNonEmptyArray } from '@tjmgregory/asserts';
isNonEmptyArray(val);See LICENSE

