is-explicit
Version:
Combines instance of operator and typeof operator in a way that works seamlessly with objects and literals.
186 lines (131 loc) • 4.45 kB
Markdown
# is-explicit
# Why ?
- You want to do explicit type checks.
- You don't want to have to differentiate between ```typeof``` and ```instanceof```
- You keep a cool head and bring justice to chaos.
# 2.0
Breaking changes from the 1.x release, but the resulting
changes make ```is-explicit``` faster and more composable.
# Usage
``npm install is-explicit``
```js
import is from 'is-explicit'
```
## Does a variable have a value?
```js
is.defined(undefined) //false
is.defined(null) //false
is.defined(NaN) //false
is.defined(10) //true
```
## Is a variable a specific type?
```js
is([], Object) //true
is([], Array) //true
is(true, Boolean) //true
is(false, Boolean) //true
is(10, Number) //true
is('str', String) //true
is('str', Object) //false
is(new String('str'), String) //true
is(new String('str'), Object) //true
is(/expr/, RegExp) //true
is(/expr/, Object) //true
is(function(){}, Object) //true
is(function(){}, Function) //true
is(new function(){}, Object) //true
is(new function(){}, Function) //False
is(Array, Object) //true
is(Array, Function) //true
is(Array, Array) //false
is(Symbol(), Symbol) //true
is(Symbol.iterator, Symbol) //true
is(Symbol(), Object) //false
```
## Is a variable a custom type?
```js
function Foo() {}
is (new Foo(), Foo) // true
const foo = function(){}
const bar = function(){}
is(new foo(), foo) // true
is(new bar(), foo) // false
```
## Is a variable one of multiple types?
```js
is('str', [Number, Boolean, String]) // true
```
## Types are expected to be functions:
```js
is('str', 'otherstring') //throws Error
```
## Is a value an Array of a specific type?
```js
is.arrayOf(['str'], String) // == true
is.arrayOf([0, false, new Date(), 'str'], String) // == false
is.arrayOf([0,'str',10,'cake'], [String, Number]) // == true,
```
## Is a value an Object of a specific type?
```js
is.objectOf([ 0, 'str' ], String) // == false
is.objectOf({ }, String) // == false
is.objectOf({ foo: '1', bar: '2' }, String) // == true
is.objectOf({ foo: '1', bar: 2 }, [ String, Number ]) // == true
```
## Is a value a plain Object?
```js
is.plainObject(['str']) // == false
is.plainObject(new Date()) // == false
is.plainObject({}) // == true
is.plainObject(new Object()) // == true
function FooBar() { }
is.plainObject(new FooBar) // == false
```
## Binding
Binding is now binds it to a type:
```js
class Foo { }
const isFoo = Foo::is
isFoo(new Foo()) // true
```
Bind to multiple types:
```js
const isBoolOrFunc = [ Boolean, Function ]::is
isBoolOrFunc(false) // true
```
Better composition:
```js
const mixed = [ 0, 'string', 1, true, 2, Symbol('bad') ]
const numbers = mixed.filter(Number::is)
```
## Shortcuts
```js
import is from 'is-explicit'
const value = 'whatever'
is.string(value) // == String::is(value)
is.number(value) // == Number::is(value)
is.bool(value) // == Boolean::is(value)
is.func(value) // == Function::is(value)
is.symbol(value) // == Symbol::is(value)
is.primitive(value) // == [ Boolean, Number, String ]::is(value)
is.arrayOf.string(value) // == String::is.arrayOf
is.arrayOf.number (value) // == Number::is.arrayOf
is.arrayOf.bool(value) // == Boolean::is.arrayOf
is.arrayOf.symbol(value) // == Symbol::is.arrayOf
is.arrayOf.func(value) // == Function::is.arrayOf
is.arrayOf.primitive(value) // == [ Boolean, Number, String ]::is.arrayOf
is.objectOf.string(value) // == String::is.objectOf
is.objectOf.number (value) // == Number::is.objectOf
is.objectOf.bool(value) // == Boolean::is.objectOf
is.objectOf.symbol(value) // == Symbol::is.objectOf
is.objectOf.func(value) // == Function::is.objectOf
is.objectOf.primitive(value) // == [ Boolean, Number, String ]::isArrayOf
```
## Additional Helpers
```js
import is from 'is-explicit'
is.defined() // returns true if input is not null, undefined or NaN
is.arrayOf.plainObject() // returns true if input is an array of plain objects
is.instanceable() // returns true if input is a function with a prototype (ie: arrow functions will return false)
is.subclassOf() // returns true if input is a class that extends the provided type
```