Skip to content

Commit

Permalink
feat(utilities): add objectEntries function (#471)
Browse files Browse the repository at this point in the history
* feat(utilities): add `objectEntries` function

* test(objectEntries): cover readonly types

* fix(objectEntires): return type

Co-authored-by: imranbarbhuiya

* fix(objectEntries): return type for arrays

* Update packages/utilities/src/lib/objectEntries.ts

Co-authored-by: Jeroen Claassens <jeroen.claassens@live.nl>
  • Loading branch information
RealShadowNova and favna committed Oct 1, 2022
1 parent 1606208 commit 84c1418
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/utilities/src/index.ts
Expand Up @@ -32,6 +32,7 @@ export * from './lib/makeObject';
export * from './lib/mergeDefault';
export * from './lib/mergeObjects';
export * from './lib/noop';
export * from './lib/objectEntries';
export * from './lib/objectToTuples';
export * from './lib/objectValues';
export * from './lib/parseUrl';
Expand Down
5 changes: 5 additions & 0 deletions packages/utilities/src/lib/objectEntries.ts
@@ -0,0 +1,5 @@
import type { NonNullObject } from './utilityTypes';

export function objectEntries<T extends NonNullObject>(obj: T): T extends ArrayLike<any> ? [`${number}`, T[number]][] : [keyof T, T[keyof T]][] {
return Object.entries(obj) as T extends ArrayLike<infer Values> ? Values[] : [keyof T, T[keyof T]][];
}
45 changes: 45 additions & 0 deletions packages/utilities/tests/objectEntries.test.ts
@@ -0,0 +1,45 @@
import { objectEntries } from '../src';

describe('objectEntries', () => {
test('GIVEN basic readonly THEN returns expected', () => {
const source = { a: 'Hello', b: 420 } as const;
const expected = [
['a', 'Hello'],
['b', 420]
] as [string, unknown][];

expect<['a' | 'b', 'Hello' | 420][]>(objectEntries(source)).toEqual(expected);
});

test('GIVEN deep readonly THEN returns expected', () => {
const source = { a: 'Hello', b: 420, deep: { i: [] } } as const;
const expected = [
['a', 'Hello'],
['b', 420],
['deep', { i: [] }]
] as [string, unknown][];

expect<['a' | 'b' | 'deep', 'Hello' | 420 | { i: readonly [] }][]>(objectEntries(source)).toEqual(expected);
});

test('GIVEN basic THEN returns expected', () => {
const source = { a: 'Hello', b: 420 };
const expected = [
['a', 'Hello'],
['b', 420]
] as [string, unknown][];

expect(objectEntries(source)).toEqual(expected);
});

test('GIVEN deep THEN returns expected', () => {
const source = { a: 'Hello', b: 420, deep: { i: [] } };
const expected = [
['a', 'Hello'],
['b', 420],
['deep', { i: [] }]
] as [string, unknown][];

expect(objectEntries(source)).toEqual(expected);
});
});

0 comments on commit 84c1418

Please sign in to comment.