Skip to content

Commit

Permalink
feat(micro-dash): improve typing of forEach
Browse files Browse the repository at this point in the history
Closes #22
  • Loading branch information
ersimont committed Feb 3, 2021
1 parent 4b1aad6 commit 74dbdbf
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 6 deletions.
12 changes: 6 additions & 6 deletions projects/micro-dash/src/lib/collection/for-each.ts
@@ -1,4 +1,4 @@
import { ArrayIteratee, ObjectIteratee } from '../interfaces';
import { ArrayIteratee, Nil, ObjectIteratee } from '../interfaces';
import { forOwnOfNonArray } from '../object/for-own';

/**
Expand All @@ -9,13 +9,13 @@ import { forOwnOfNonArray } from '../object/for-own';
* - Micro-dash: 236 bytes
*/

export function forEach<T>(
array: T[] | undefined,
iteratee: ArrayIteratee<T, void | boolean>,
): T[];
export function forEach<T extends any[] | Nil>(
array: T,
iteratee: ArrayIteratee<NonNullable<T>[number], void | boolean>,
): T;
export function forEach<T>(
object: T,
iteratee: ObjectIteratee<T, void | boolean>,
iteratee: ObjectIteratee<NonNullable<T>, void | boolean>,
): T;

export function forEach(collection: any, iteratee: any): any {
Expand Down
111 changes: 111 additions & 0 deletions projects/micro-dash/src/typing-tests/collection/for-each.dts-spec.ts
@@ -0,0 +1,111 @@
import { forEach } from '../../lib/collection';

interface Obj {
a: 1;
b: string;
}

declare const array: number[];
declare const arrayOrN: number[] | null;
declare const arrayOrU: number[] | undefined;

// $ExpectType number[]
forEach(
array,
(
// $ExpectType number
val,
// $ExpectType number
index,
) => {},
);
// $ExpectType number[] | null
forEach(
arrayOrN,
(
// $ExpectType number
val,
// $ExpectType number
index,
) => {},
);
// $ExpectType number[] | undefined
forEach(
arrayOrU,
(
// $ExpectType number
val,
// $ExpectType number
index,
) => {},
);

declare const tuple: [string, Date];
declare const tupleOrN: [string, Date] | null;
declare const tupleOrU: [string, Date] | undefined;

// $ExpectType [string, Date]
forEach(
tuple,
(
// $ExpectType string | Date
val,
// $ExpectType number
index,
) => {},
);
// $ExpectType [string, Date] | null
forEach(
tupleOrN,
(
// $ExpectType string | Date
val,
// $ExpectType number
index,
) => {},
);
// $ExpectType [string, Date] | undefined
forEach(
tupleOrU,
(
// $ExpectType string | Date
val,
// $ExpectType number
index,
) => {},
);

declare const obj: Obj;
declare const objOrN: Obj | null;
declare const objOrU: Obj | undefined;

// $ExpectType Obj
forEach(
obj,
(
// $ExpectType string | 1
val,
// $ExpectType "a" | "b"
key,
) => {},
);
// $ExpectType Obj | null
forEach(
objOrN,
(
// $ExpectType string | 1
val,
// $ExpectType "a" | "b"
key,
) => {},
);
// $ExpectType Obj | undefined
forEach(
objOrU,
(
// $ExpectType string | 1
val,
// $ExpectType "a" | "b"
key,
) => {},
);

0 comments on commit 74dbdbf

Please sign in to comment.