From 54579a0167139f809e9f6fa6de658714e86a6ca0 Mon Sep 17 00:00:00 2001 From: Dave Cohen Date: Sat, 15 Feb 2020 13:22:40 -0600 Subject: [PATCH] Add multiple predicates to is.any --- source/index.ts | 16 +++++++++++++--- test/test.ts | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/source/index.ts b/source/index.ts index 4d42bfe..2c354e6 100644 --- a/source/index.ts +++ b/source/index.ts @@ -373,6 +373,7 @@ is.emptyMap = (value: unknown): value is Map => is.map(value) && v is.nonEmptyMap = (value: unknown): value is Map => is.map(value) && value.size > 0; export type Predicate = (value: unknown) => boolean; +export type OverloadedPredicate = Predicate | Predicate[]; type ArrayMethod = (fn: (value: unknown, index: number, array: unknown[]) => boolean, thisArg?: unknown) => boolean; @@ -388,7 +389,16 @@ const predicateOnArray = (method: ArrayMethod, predicate: Predicate, values: unk return method.call(values, predicate); }; -is.any = (predicate: Predicate, ...values: unknown[]): boolean => predicateOnArray(Array.prototype.some, predicate, values); +is.any = (predicate: OverloadedPredicate, ...values: unknown[]): boolean => { + if (is.array(predicate) === true) { + return (predicate as Predicate[]).some((singlePredicate: Predicate) => + predicateOnArray(Array.prototype.some, singlePredicate, values) + ); + } + + return predicateOnArray(Array.prototype.some, predicate as Predicate, values); +}; + is.all = (predicate: Predicate, ...values: unknown[]): boolean => predicateOnArray(Array.prototype.every, predicate, values); const assertType = (condition: boolean, description: string, value: unknown): asserts condition => { @@ -526,7 +536,7 @@ interface Assert { inRange: (value: number, range: number | number[]) => asserts value is number; // Variadic functions. - any: (predicate: Predicate, ...values: unknown[]) => void | never; + any: (predicate: OverloadedPredicate, ...values: unknown[]) => void | never; all: (predicate: Predicate, ...values: unknown[]) => void | never; } @@ -616,7 +626,7 @@ export const assert: Assert = { inRange: (value: number, range: number | number[]): asserts value is number => assertType(is.inRange(value, range), AssertionTypeDescription.inRange, value), // Variadic functions. - any: (predicate: Predicate, ...values: unknown[]): void | never => assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values), + any: (predicate: OverloadedPredicate, ...values: unknown[]): void | never => assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values), all: (predicate: Predicate, ...values: unknown[]): void | never => assertType(is.all(predicate, ...values), AssertionTypeDescription.all, values) }; diff --git a/test/test.ts b/test/test.ts index f48b7c3..2909247 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1458,6 +1458,8 @@ test('is.any', t => { t.true(is.any(is.object, false, {}, 'unicorns')); t.false(is.any(is.boolean, '🦄', [], 3)); t.false(is.any(is.integer, true, 'lol', {})); + t.true(is.any([is.string, is.number], {}, true, '🦄')); + t.false(is.any([is.boolean, is.number], 'unicorns', [], new Map())); t.throws(() => { is.any(null as any, true);