Skip to content

Commit 67086f1

Browse files
committed
feat(all): add type-narrowing signature
(cherry picked from commit 6536fa8)
1 parent 6409e59 commit 67086f1

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
@@ -323,6 +323,18 @@ test("any", t => {
323323
test("all", t => {
324324
t.true(all([1, 2, 3], e => e < 4));
325325
t.false(all([1, 2, 3], e => e > 2));
326+
327+
const mixed1: Array<string | number> = [1, 2, "hello", 3, "goodbye"];
328+
const mixed2: Array<string | number> = [1, 2, 3];
329+
330+
const acceptNumbers = (array: readonly number[]): boolean => true;
331+
const isNumber = (v: unknown): v is number => typeof v === "number";
332+
333+
t.false(all(mixed1, isNumber));
334+
t.true(all(mixed2, isNumber));
335+
336+
t.false(all(mixed1, isNumber) ? acceptNumbers(mixed1) : false);
337+
t.true(all(mixed2, isNumber) ? acceptNumbers(mixed2) : false);
326338
});
327339

328340
test("concat", t => {

index.ts

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

675+
export function all<T, U extends T>(
676+
array: readonly T[],
677+
predicate: (element: T, index: number) => element is U
678+
): array is readonly U[];
679+
export function all<T, U extends T>(
680+
array: ArrayLike<T>,
681+
predicate: (element: T, index: number) => element is U
682+
): array is ArrayLike<U>;
683+
export function all<T>(
684+
array: ArrayLike<T>,
685+
predicate: (element: T, index: number) => boolean
686+
): boolean;
675687
export function all<T>(
676688
array: ArrayLike<T>,
677689
predicate: (element: T, index: number) => boolean
678690
): boolean {
679691
return !any(array, (element, index) => !predicate(element, index));
680692
}
681693

694+
export function allFn<T, U extends T>(
695+
predicate: (element: T, index: number) => element is U
696+
): (array: ArrayLike<T>) => array is ArrayLike<U>;
697+
export function allFn<T>(
698+
predicate: (element: T, index: number) => boolean
699+
): (array: ArrayLike<T>) => boolean;
682700
export function allFn<T>(
683701
predicate: (element: T, index: number) => boolean
684702
): (array: ArrayLike<T>) => boolean {

0 commit comments

Comments
 (0)