// Type definitions for spected 0.7 // Project: https://github.com/25th-floor/spected // Definitions by: Benjamin Makus // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 declare function spected = SpecValue>(spec: SPEC, input: ROOTINPUT): Result; type Predicate = (value: INPUT, inputs: ROOTINPUT) => boolean; type ErrorMsg = | (string | number | boolean | symbol | null | undefined | object) | ((value: INPUT, field: string) => any); export type Spec = [Predicate, ErrorMsg]; export type SpecArray = Array>; export type SpecFunction = [INPUT] extends [ReadonlyArray] ? (value: INPUT) => ReadonlyArray> : [INPUT] extends [object] ? (value: INPUT) => SpecObject : (value: INPUT) => SpecArray; export type SpecObject = Partial<{[key in keyof INPUT]: SpecValue}>; export type SpecValue = [INPUT] extends [ReadonlyArray] ? SpecArray | SpecFunction : [INPUT] extends [object] ? SpecArray | SpecFunction | SpecObject : SpecArray | SpecFunction; export type Result = {[key in keyof INPUT]: true | any[] | Result}; export default spected;