Skip to content

Commit

Permalink
improve type definitions for util package
Browse files Browse the repository at this point in the history
  • Loading branch information
k-yle authored and bhousel committed Sep 9, 2024
1 parent c9cef59 commit 57a55cc
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 17 deletions.
25 changes: 11 additions & 14 deletions packages/util/src/array.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
type ArrayOrSet = Array<unknown> | Set<unknown>;


/** Checks if provided arguments have same elements at the same indices
* @param a
* @param b
* @returns Returns true if a and b have the same elements at the same indices, false otherwise
*/
export function utilArrayIdentical(a: Array<unknown>, b: Array<unknown>): boolean {
export function utilArrayIdentical<T>(a: Array<T>, b: Array<T>): boolean {
// an array is always identical to itself
if (a === b) return true;

Expand All @@ -30,7 +27,7 @@ export function utilArrayIdentical(a: Array<unknown>, b: Array<unknown>): boolea
* utilArrayDifference(a, b) // returns: [1]
* utilArrayDifference(b, a) // returns: [4]
*/
export function utilArrayDifference(a: ArrayOrSet, b: ArrayOrSet): Array<unknown> {
export function utilArrayDifference<T>(a: Iterable<T>, b: Iterable<T>): Array<T> {
const other = new Set(b);
return Array.from(new Set(a)).filter(val => !other.has(val));
}
Expand All @@ -46,7 +43,7 @@ export function utilArrayDifference(a: ArrayOrSet, b: ArrayOrSet): Array<unknown
* let b = [4,3,2];
* utilArrayIntersection(a, b) // returns: [2,3]
*/
export function utilArrayIntersection(a: ArrayOrSet, b: ArrayOrSet): Array<unknown> {
export function utilArrayIntersection<T>(a: Iterable<T>, b: Iterable<T>): Array<T> {
const other = new Set(b);
return Array.from(new Set(a)).filter(val => other.has(val));
}
Expand All @@ -62,7 +59,7 @@ export function utilArrayIntersection(a: ArrayOrSet, b: ArrayOrSet): Array<unkno
* let b = [4,3,2];
* utilArrayUnion(a, b) // returns: [1,2,3,4]
*/
export function utilArrayUnion(a: ArrayOrSet, b: ArrayOrSet): Array<unknown> {
export function utilArrayUnion<T>(a: Iterable<T>, b: Array<T> | Set<T>): Array<T> {
const result = new Set(a);
b.forEach(val => result.add(val));
return Array.from(result);
Expand All @@ -76,7 +73,7 @@ export function utilArrayUnion(a: ArrayOrSet, b: ArrayOrSet): Array<unknown> {
* let a = [1,1,2,3,3];
* utilArrayUniq(a) // returns: [1,2,3]
*/
export function utilArrayUniq(a: ArrayOrSet): Array<unknown> {
export function utilArrayUniq<T>(a: Iterable<T>): Array<T> {
return Array.from(new Set(a));
}

Expand All @@ -89,7 +86,7 @@ export function utilArrayUniq(a: ArrayOrSet): Array<unknown> {
* let a = [1,2,3,4,5,6,7];
* utilArrayChunk(a, 3); // returns: [[1,2,3],[4,5,6],[7]];
*/
export function utilArrayChunk(a: Array<unknown>, chunkSize: number): Array<Array<unknown>> {
export function utilArrayChunk<T>(a: Array<T>, chunkSize: number): Array<Array<T>> {
if (!chunkSize || chunkSize < 0) return [a.slice()];

const result = new Array(Math.ceil(a.length / chunkSize));
Expand All @@ -106,7 +103,7 @@ export function utilArrayChunk(a: Array<unknown>, chunkSize: number): Array<Arra
* let a = [[1,2,3],[4,5,6],[7]];
* utilArrayFlatten(a); // returns: [1,2,3,4,5,6,7];
*/
export function utilArrayFlatten(a: Array<Array<unknown>>): Array<unknown> {
export function utilArrayFlatten<T>(a: Array<Array<T>>): Array<T> {
return a.reduce((acc, val) => acc.concat(val), []);
}

Expand Down Expand Up @@ -137,9 +134,9 @@ export function utilArrayFlatten(a: Array<Array<unknown>>): Array<unknown> {
* 5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
* }
*/
export function utilArrayGroupBy(a, key): object {
export function utilArrayGroupBy<T>(a: T[], key: keyof T | ((item: T) => string)): Record<string, T[]> {
return a.reduce((acc, item) => {
const group = typeof key === 'function' ? key(item) : item[key];
const group = typeof key === 'function' ? key(item) : (item[key] as string);
(acc[group] = acc[group] || []).push(item);
return acc;
}, {});
Expand Down Expand Up @@ -174,9 +171,9 @@ export function utilArrayGroupBy(a, key): object {
* { type: 'Cat', name: 'Leo' }
* }
*/
export function utilArrayUniqBy(a, key): Array<unknown> {
export function utilArrayUniqBy<T>(a: T[], key: keyof T | ((item: T) => string)): Array<T> {
const seen = new Set();
return a.reduce((acc, item) => {
return a.reduce<T[]>((acc, item) => {
const val = typeof key === 'function' ? key(item) : item[key];
if (val && !seen.has(val)) {
seen.add(val);
Expand Down
9 changes: 6 additions & 3 deletions packages/util/src/object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
* @param omitKeys - keys to omit
* @returns
*/
export function utilObjectOmit(obj: object, omitKeys: string[]): object {
const result = {};
export function utilObjectOmit<T extends object, Keys extends keyof T>(
obj: T,
omitKeys: Keys[],
): Omit<T, Keys> {
const result = {} as Omit<T, Keys>;
for (const [k, v] of Object.entries(obj)) {
if (omitKeys.includes(k)) continue;
if (omitKeys.includes(k as Keys)) continue;
result[k] = v; // keep
}
return result;
Expand Down

0 comments on commit 57a55cc

Please sign in to comment.