Skip to content

Commit 6536fa8

Browse files
committed
feat(all): add type-narrowing signature
1 parent 0044a90 commit 6536fa8

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
@@ -675,13 +675,31 @@ export function anyFn<T>(
675675
return array => any(array, predicate);
676676
}
677677

678+
export function all<T, U extends T>(
679+
array: readonly T[],
680+
predicate: (element: T, index: number) => element is U
681+
): array is readonly U[];
682+
export function all<T, U extends T>(
683+
array: ArrayLike<T>,
684+
predicate: (element: T, index: number) => element is U
685+
): array is ArrayLike<U>;
686+
export function all<T>(
687+
array: ArrayLike<T>,
688+
predicate: (element: T, index: number) => boolean
689+
): boolean;
678690
export function all<T>(
679691
array: ArrayLike<T>,
680692
predicate: (element: T, index: number) => boolean
681693
): boolean {
682694
return !any(array, (element, index) => !predicate(element, index));
683695
}
684696

697+
export function allFn<T, U extends T>(
698+
predicate: (element: T, index: number) => element is U
699+
): (array: ArrayLike<T>) => array is ArrayLike<U>;
700+
export function allFn<T>(
701+
predicate: (element: T, index: number) => boolean
702+
): (array: ArrayLike<T>) => boolean;
685703
export function allFn<T>(
686704
predicate: (element: T, index: number) => boolean
687705
): (array: ArrayLike<T>) => boolean {

0 commit comments

Comments
 (0)