Skip to content

Commit 4405ad7

Browse files
committed
feat(all): add type-narrowing signature
1 parent 8482a41 commit 4405ad7

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

index.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,18 @@ test("any", t => {
328328
test("all", t => {
329329
t.true(all([1, 2, 3], e => e < 4));
330330
t.false(all([1, 2, 3], e => e > 2));
331+
332+
const mixed1: Array<string | number> = [1, 2, "hello", 3, "goodbye"];
333+
const mixed2: Array<string | number> = [1, 2, 3];
334+
335+
const acceptNumbers = (array: readonly number[]): boolean => true;
336+
const isNumber = (v: unknown): v is number => typeof v === "number";
337+
338+
t.false(all(mixed1, isNumber));
339+
t.true(all(mixed2, isNumber));
340+
341+
t.false(all(mixed1, isNumber) ? acceptNumbers(mixed1) : false);
342+
t.true(all(mixed2, isNumber) ? acceptNumbers(mixed2) : false);
331343
});
332344

333345
test("concat", t => {

index.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,13 +665,31 @@ export function anyFn<T>(
665665
return array => any(array, predicate);
666666
}
667667

668+
export function all<T, U extends T>(
669+
array: readonly T[],
670+
predicate: (element: T, index: number) => element is U
671+
): array is readonly U[];
672+
export function all<T, U extends T>(
673+
array: ArrayLike<T>,
674+
predicate: (element: T, index: number) => element is U
675+
): array is ArrayLike<U>;
676+
export function all<T>(
677+
array: ArrayLike<T>,
678+
predicate: (element: T, index: number) => boolean
679+
): boolean;
668680
export function all<T>(
669681
array: ArrayLike<T>,
670682
predicate: (element: T, index: number) => boolean
671683
): boolean {
672684
return !any(array, (element, index) => !predicate(element, index));
673685
}
674686

687+
export function allFn<T, U extends T>(
688+
predicate: (element: T, index: number) => element is U
689+
): (array: ArrayLike<T>) => array is ArrayLike<U>;
690+
export function allFn<T>(
691+
predicate: (element: T, index: number) => boolean
692+
): (array: ArrayLike<T>) => boolean;
675693
export function allFn<T>(
676694
predicate: (element: T, index: number) => boolean
677695
): (array: ArrayLike<T>) => boolean {

0 commit comments

Comments
 (0)