Skip to content

Commit 968cc8f

Browse files
authored
Merge pull request #3 from hachibeeDI/enhance/object-support-generic-record
enhance: Object.value|entries supports a generic Record type
2 parents 2835afb + ce9975f commit 968cc8f

File tree

2 files changed

+25
-24
lines changed

2 files changed

+25
-24
lines changed

lib/lib.es2017.object.d.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,17 @@ interface ObjectConstructor {
55
* Returns an array of values of the enumerable properties of an object
66
* @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
77
*/
8-
values<T>(
9-
o: T
10-
): string | number extends keyof T
11-
? T[string | number][]
12-
: string extends keyof T
13-
? T[string][]
14-
: number extends keyof T
15-
? T[number][]
16-
: unknown[];
8+
values<T>(o: ArrayLike<T>): T[];
9+
values<K extends string | number | symbol, V>(o: Record<K, V>): V[];
10+
values(o: unknown): unknown[];
1711

1812
/**
1913
* Returns an array of key/values of the enumerable properties of an object
2014
* @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
2115
*/
22-
entries<T>(
23-
o: T
24-
): [
25-
string,
26-
string | number extends keyof T
27-
? T[string | number]
28-
: string extends keyof T
29-
? T[string]
30-
: number extends keyof T
31-
? T[number]
32-
: unknown
33-
][];
16+
entries<T>(o: ArrayLike<T>): [string, T][];
17+
entries<K extends string | number | symbol, V>(o: Record<K, V>): [string, V][];
18+
entries<T>(o: T): [string, unknown][];
3419

3520
/**
3621
* Returns an object containing all own property descriptors of an object

tests/es2017.object.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import { expectType } from "tsd";
44

5+
function createGenericRecord<K extends string, V>(keys: K[], values: V[]): Record<K, V> {
6+
return Object.fromEntries(keys.map((k, i) => [k, values[i]!] as const));
7+
}
8+
59
{
6-
const obj1 = { foo: 123 };
10+
const obj1: {[k: string]: number} = { foo: 123 };
711
const values1 = Object.values(obj1);
812
const entries1 = Object.entries(obj1);
9-
expectType<unknown[]>(values1);
10-
expectType<[string, unknown][]>(entries1);
13+
expectType<number[]>(values1);
14+
expectType<[string, number][]>(entries1);
1115

1216
const obj2: Record<string, number> = {};
1317
const values2 = Object.values(obj2);
@@ -20,6 +24,18 @@ import { expectType } from "tsd";
2024
const entries3 = Object.entries(obj3);
2125
expectType<string[]>(values3);
2226
expectType<[string, string][]>(entries3);
27+
28+
const obj4 = createGenericRecord(["foo", "bar", "baz"], [1, 2, 3]);
29+
const values4 = Object.values(obj4);
30+
const entries4 = Object.entries(obj4);
31+
expectType<number[]>(values4);
32+
expectType<[string, number][]>(entries4);
33+
34+
const obj5 = createGenericRecord(["foo", "bar", "baz"], [1, obj1, 3]);
35+
const values5 = Object.values(obj5);
36+
const entries5 = Object.entries(obj5);
37+
expectType<(number | {[k: string]: number})[]>(values5);
38+
expectType<[string, (number | {[k: string]: number})][]>(entries5);
2339
}
2440
function test<T>(obj: T) {
2541
const values = Object.values(obj);

0 commit comments

Comments
 (0)