Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/utilities/src/lib/objectEntries.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export function objectEntries<T extends object>(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]][];
export function objectEntries<T extends object>(obj: T): T extends ArrayLike<infer Values> ? [`${number}`, Values][] : [keyof T, T[keyof T]][] {
return Object.entries(obj) as T extends ArrayLike<infer Values> ? [`${number}`, Values][] : [keyof T, T[keyof T]][];
}
2 changes: 1 addition & 1 deletion packages/utilities/src/lib/objectKeys.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export function objectKeys<T extends object>(obj: T): T extends ArrayLike<any> ? `${number}`[] : (keyof T)[] {
return Object.keys(obj) as T extends ArrayLike<infer Values> ? Values[] : (keyof T)[];
return Object.keys(obj) as T extends ArrayLike<any> ? `${number}`[] : (keyof T)[];
}
2 changes: 1 addition & 1 deletion packages/utilities/src/lib/objectValues.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export function objectValues<T extends object>(obj: T): T extends ArrayLike<any> ? T[number][] : T[keyof T][] {
export function objectValues<T extends object>(obj: T): T extends ArrayLike<infer Values> ? Values[] : T[keyof T][] {
return Object.values(obj) as T extends ArrayLike<infer Values> ? Values[] : T[keyof T][];
}
32 changes: 26 additions & 6 deletions packages/utilities/tests/objectEntries.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ describe('objectEntries', () => {
const expected = [
['a', 'Hello'],
['b', 420]
] as [string, unknown][];
];

expect<['a' | 'b', 'Hello' | 420][]>(objectEntries(source)).toEqual(expected);
});
Expand All @@ -17,19 +17,29 @@ describe('objectEntries', () => {
['a', 'Hello'],
['b', 420],
['deep', { i: [] }]
] as [string, unknown][];
];

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

test('GIVEN array readonly THEN returns expected', () => {
const source = ['Hello', 420] as const;
const expected = [
['0', 'Hello'],
['1', 420]
];

expect<[`${number}`, 'Hello' | 420][]>(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);
expect<['a' | 'b', string | number][]>(objectEntries(source)).toEqual(expected);
});

test('GIVEN deep THEN returns expected', () => {
Expand All @@ -38,8 +48,18 @@ describe('objectEntries', () => {
['a', 'Hello'],
['b', 420],
['deep', { i: [] }]
] as [string, unknown][];
];

expect<['a' | 'b' | 'deep', string | number | { i: never[] }][]>(objectEntries(source)).toEqual(expected);
});

test('GIVEN array THEN returns expected', () => {
const source = ['Hello', 420];
const expected = [
['0', 'Hello'],
['1', 420]
];

expect(objectEntries(source)).toEqual(expected);
expect<[`${number}`, string | number][]>(objectEntries(source)).toEqual(expected);
});
});
18 changes: 16 additions & 2 deletions packages/utilities/tests/objectKeys.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,31 @@ describe('objectKeys', () => {
expect<('a' | 'b' | 'deep')[]>(objectKeys(source)).toEqual(expected);
});

test('GIVEN array readonly THEN returns expected', () => {
const source = ['Hello', 420] as const;
const expected = ['0', '1'];

expect<`${number}`[]>(objectKeys(source)).toEqual(expected);
});

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

expect(objectKeys(source)).toEqual(expected);
expect<('a' | 'b')[]>(objectKeys(source)).toEqual(expected);
});

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

expect(objectKeys(source)).toEqual(expected);
expect<('a' | 'b' | 'deep')[]>(objectKeys(source)).toEqual(expected);
});

test('GIVEN array THEN returns expected', () => {
const source = ['Hello', 420];
const expected = ['0', '1'];

expect<`${number}`[]>(objectKeys(source)).toEqual(expected);
});
});
18 changes: 15 additions & 3 deletions packages/utilities/tests/objectValues.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,29 @@ describe('objectValues', () => {
expect<('Hello' | 420 | { i: readonly [] })[]>(objectValues(source)).toEqual(expected);
});

test('GIVEN basic readonly THEN returns expected', () => {
test('GIVEN array readonly THEN returns same', () => {
const source = ['Hello', 420] as const;

expect<('Hello' | 420)[]>(objectValues(source)).toEqual(source);
});

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

expect(objectValues(source)).toEqual(expected);
expect<(string | number)[]>(objectValues(source)).toEqual(expected);
});

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

expect(objectValues(source)).toEqual(expected);
expect<(string | number | { i: never[] })[]>(objectValues(source)).toEqual(expected);
});

test('GIVEN array THEN returns same', () => {
const source = ['Hello', 420];

expect<(string | number)[]>(objectValues(source)).toEqual(source);
});
});
Loading