Predicates
Overview
Predicates are boolean functions that return true or false for a given input. Predicates are useful for those moments where we want to assert if an object's type tag is of an specific type. Hence why the TypeTags object has a predicate for each of its types.
import { TypeTags } from 'typetags'
TypeTags.String// → [object String]
TypeTags.isString('🎉')// → true
TypeTags.Array// → [object Array]
TypeTags.isArray(TypeTags.Array)// → trueThere are two kinds of predicate functions to help us with assertions: generics and specifics.
Generics
Used for overall checks. For example, to check if an object has a default type tag:
const { TypeTags } = require('typetags')
const o = Object.create(null)
TypeTags.isDefault(o)// → falseSpecifics
Allows us to check for specific tags or groups of tags:
const { TypeTags } = require('typetags')
const maybeTyped = [1, 2, 3]
TypeTags.isTypedArray(maybeTyped)// → false
TypeTags.get(arr)// → '[object Array]'We can take advantage of object destructuring to extract predicates from the TypeTags object.
import { TypeTags } from 'typetags'
const { isArray, isSet } = TypeTags
console.log(isArray([]))// → true
console.log(isSet(''))// → falseWe can also destructure on import when using require with common-js. There's no need to instantiate it as TypeTags itself is not a function or a constructor.
const { isMap } = require('typetags').TypeTags
const cool = new Map()
console.log(isMap(cool))// → trueSignature
declare type PredicateNames = `is${Types | NestedPredicates}`
declare interface Predicate { predicate(value: any): boolean}
declare type PredicateMapper<Type> = { [Prop in keyof Type as PredicateNames]: Type[Prop]}
declare type Predicates = PredicateMapper<Predicate>