If you use this repo, star it β¨
π» Comprehensive collection of type guards for JavaScript and TypeScript
Inspired by Elixir guards
Zero dependencies πͺ
npm install @sniptt/guards
import { ... } from 'https://deno.land/x/guards/mod.ts'
// TODO
The latest ECMAScript standard defines nine types:
- Six Data Types that are primitives, checked by
typeof
operator: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
, newDate
and almost everything made withnew
keyword;Function
non data structure, though it also answers fortypeof
operator:typeof instance === "function"
. This answer is done as a special shorthand forFunction
s, though everyFunction
constructor is derived fromObject
constructor.
- Structural Root Primitive
null
:typeof instance === "object"
. Special primitive type having additional usage for it's value: if object is not inherited, thennull
is shown;
Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Sample usage:
import { primitives } from '@sniptt/guards';
primitives.isNumber(val);
or
import { isNumber } from '@sniptt/guards';
isNumber(val);
import { isBigInt } from '@sniptt/guards';
let val: bigint | number;
if (isBigInt(val)) {
// TypeScript will infer val: bigint
} else {
// TypeScript will infer val: number
}
import { isBoolean } from '@sniptt/guards';
let val: boolean | number;
if (isBoolean(val)) {
// TypeScript will infer val: boolean
} else {
// TypeScript will infer val: number
}
Answers false
to NaN
!
See also:
import { isNumber } from '@sniptt/guards';
let val: number | string;
if (isNumber(val)) {
// TypeScript will infer val: number
} else {
// TypeScript will infer val: string
}
import { isString } from '@sniptt/guards';
let val: string | number;
if (isString(val)) {
// TypeScript will infer val: string
} else {
// TypeScript will infer val: number
}
import { isSymbol } from '@sniptt/guards';
let val: symbol | string;
if (isSymbol(val)) {
// TypeScript will infer val: symbol
} else {
// TypeScript will infer val: string
}
import { isUndefined } from '@sniptt/guards';
let val: undefined | null;
if (isUndefined(val)) {
// TypeScript will infer val: undefined
} else {
// TypeScript will infer val: null
}
Sample usage:
import { structural } from '@sniptt/guards';
structural.isMap(val);
or
import { isMap } from '@sniptt/guards';
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)
Answers true
if and only if Array.isArray(value) === true
.
Answers true
if and only if (value instanceof Map) === true
.
Answers true
if and only if (value instanceof Set) === true
.
Answers true
if and only if (value instanceof WeakMap) === true
.
Answers true
if and only if (value instanceof WeakSet) === true
.
Answers true
if and only if (value instanceof Date) === true
.
Sample usage:
import { convenience } from '@sniptt/guards';
convenience.isNonEmptyArray(val);
or
import { isNonEmptyArray } from '@sniptt/guards';
isNonEmptyArray(val);
test("isObjectOrNull", (t) => {
t.is(convenience.isObjectOrNull({}), true);
t.is(convenience.isObjectOrNull(null), true);
t.is(convenience.isObjectOrNull(new Set()), true);
});
test("isNonEmptyArray", (t) => {
t.is(convenience.isNonEmptyArray([1, 2]), true);
t.is(convenience.isNonEmptyArray([1]), true);
t.is(convenience.isNonEmptyArray([]), false);
});
test("isNonEmptyString", (t) => {
t.is(convenience.isNonEmptyString("a"), true);
t.is(convenience.isNonEmptyString(""), false);
});
test("isNumberOrNaN", (t) => {
t.is(convenience.isNumberOrNaN(0), true);
t.is(convenience.isNumberOrNaN(42), true);
t.is(convenience.isNumberOrNaN(-42), true);
t.is(convenience.isNumberOrNaN(3.14), true);
t.is(convenience.isNumberOrNaN(-3.14), true);
t.is(convenience.isNumberOrNaN(Infinity), true);
t.is(convenience.isNumberOrNaN(-Infinity), true);
t.is(convenience.isNumberOrNaN(Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isNumberOrNaN(-Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isNumberOrNaN(NaN), true);
t.is(convenience.isNumberOrNaN(BigInt(0)), false);
});
test("isInteger", (t) => {
t.is(convenience.isInteger(0), true);
t.is(convenience.isInteger(42), true);
t.is(convenience.isInteger(-42), true);
t.is(convenience.isInteger(3.14), false);
t.is(convenience.isInteger(-3.14), false);
t.is(convenience.isInteger(Infinity), false);
t.is(convenience.isInteger(-Infinity), false);
t.is(convenience.isInteger(Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isInteger(-Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isInteger(NaN), false);
});
test("isPositiveInteger", (t) => {
t.is(convenience.isPositiveInteger(0), false);
t.is(convenience.isPositiveInteger(42), true);
t.is(convenience.isPositiveInteger(-42), false);
t.is(convenience.isPositiveInteger(3.14), false);
t.is(convenience.isPositiveInteger(-3.14), false);
t.is(convenience.isPositiveInteger(Infinity), false);
t.is(convenience.isPositiveInteger(-Infinity), false);
t.is(convenience.isPositiveInteger(Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isPositiveInteger(-Number.MAX_SAFE_INTEGER), false);
t.is(convenience.isPositiveInteger(NaN), false);
});
test("isNonNegativeInteger", (t) => {
t.is(convenience.isNonNegativeInteger(0), true);
t.is(convenience.isNonNegativeInteger(42), true);
t.is(convenience.isNonNegativeInteger(-42), false);
t.is(convenience.isNonNegativeInteger(3.14), false);
t.is(convenience.isNonNegativeInteger(-3.14), false);
t.is(convenience.isNonNegativeInteger(Infinity), false);
t.is(convenience.isNonNegativeInteger(-Infinity), false);
t.is(convenience.isNonNegativeInteger(Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isNonNegativeInteger(-Number.MAX_SAFE_INTEGER), false);
t.is(convenience.isNonNegativeInteger(NaN), false);
});
test("isNegativeInteger", (t) => {
t.is(convenience.isNegativeInteger(0), false);
t.is(convenience.isNegativeInteger(42), false);
t.is(convenience.isNegativeInteger(-42), true);
t.is(convenience.isNegativeInteger(3.14), false);
t.is(convenience.isNegativeInteger(-3.14), false);
t.is(convenience.isNegativeInteger(Infinity), false);
t.is(convenience.isNegativeInteger(-Infinity), false);
t.is(convenience.isNegativeInteger(Number.MAX_SAFE_INTEGER), false);
t.is(convenience.isNegativeInteger(-Number.MAX_SAFE_INTEGER), true);
t.is(convenience.isNegativeInteger(NaN), false);
});
See LICENSE