import * as is from '@sindresorhus/is'; export interface Validator { message: (value: T) => string; validator: (value: T) => boolean; } export interface Context { validators: Validator[]; } export class Predicate { constructor( type: string, private context: Context = { validators: [] } ) { this.addValidator({ message: value => `Expected argument to be of type \`${type}\` but received type \`${is(value)}\``, validator: value => is[type](value) }); } get validators() { return this.context.validators; } protected addValidator(validator: Validator) { this.context.validators.push(validator); return this; } }