Skip to content

Commit 8dc9dbe

Browse files
committed
fix: record type absorbed into empty object type
fixes #13
1 parent 3dd4dbd commit 8dc9dbe

File tree

6 files changed

+76
-42
lines changed

6 files changed

+76
-42
lines changed

generated/lib.es2022.object.d.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@ interface ObjectConstructor {
44
* @param o An object.
55
* @param v A property name.
66
*/
7-
hasOwn<Key extends PropertyKey>(
8-
o: object,
7+
hasOwn<Obj extends object, Key extends PropertyKey>(
8+
o: Obj,
99
v: Key
10-
): o is string extends Key
11-
? {}
12-
: number extends Key
13-
? {}
14-
: symbol extends Key
15-
? {}
16-
: Key extends PropertyKey
17-
? {
18-
[key in Key]: unknown;
19-
}
20-
: {};
10+
): o is Obj &
11+
(string extends Key
12+
? {}
13+
: number extends Key
14+
? {}
15+
: symbol extends Key
16+
? {}
17+
: Key extends PropertyKey
18+
? {
19+
[key in Key]: unknown;
20+
}
21+
: {});
2122
}
2223
// /**
2324
// * Determines whether an object has a property with the specified name.

generated/lib.es5.d.ts

+14-12
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,21 @@ interface Object {
122122
* Determines whether an object has a property with the specified name.
123123
* @param v A property name.
124124
*/
125-
hasOwnProperty<Key extends PropertyKey>(
125+
hasOwnProperty<Obj, Key extends PropertyKey>(
126+
this: Obj,
126127
v: Key
127-
): this is string extends Key
128-
? {}
129-
: number extends Key
130-
? {}
131-
: symbol extends Key
132-
? {}
133-
: Key extends PropertyKey
134-
? {
135-
[key in Key]: unknown;
136-
}
137-
: {};
128+
): this is Obj &
129+
(string extends Key
130+
? {}
131+
: number extends Key
132+
? {}
133+
: symbol extends Key
134+
? {}
135+
: Key extends PropertyKey
136+
? {
137+
[key in Key]: unknown;
138+
}
139+
: {});
138140

139141
/**
140142
* Determines whether an object exists in another object's prototype chain.

lib/lib.es2022.object.d.ts

+12-11
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@ interface ObjectConstructor {
44
* @param o An object.
55
* @param v A property name.
66
*/
7-
hasOwn<Key extends PropertyKey>(
8-
o: object,
7+
hasOwn<Obj extends object, Key extends PropertyKey>(
8+
o: Obj,
99
v: Key
10-
): o is string extends Key
11-
? {}
12-
: number extends Key
13-
? {}
14-
: symbol extends Key
15-
? {}
16-
: Key extends PropertyKey
17-
? { [key in Key]: unknown }
18-
: {};
10+
): o is Obj &
11+
(string extends Key
12+
? {}
13+
: number extends Key
14+
? {}
15+
: symbol extends Key
16+
? {}
17+
: Key extends PropertyKey
18+
? { [key in Key]: unknown }
19+
: {});
1920
}

lib/lib.es5.d.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,18 @@ interface Object {
2626
* Determines whether an object has a property with the specified name.
2727
* @param v A property name.
2828
*/
29-
hasOwnProperty<Key extends PropertyKey>(
29+
hasOwnProperty<Obj, Key extends PropertyKey>(
30+
this: Obj,
3031
v: Key
31-
): this is string extends Key
32+
): this is Obj & (string extends Key
3233
? {}
3334
: number extends Key
3435
? {}
3536
: symbol extends Key
3637
? {}
3738
: Key extends PropertyKey
3839
? { [key in Key]: unknown }
39-
: {};
40+
: {});
4041
}
4142

4243
interface ObjectConstructor {

tests/src/es2022.object.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { expectError, expectType } from "tsd";
66
const obj: object = {};
77
if (Object.hasOwn(obj, "foo")) {
88
expectType<unknown>(obj.foo);
9-
expectType<{ foo: unknown }>(obj);
9+
expectType<object & { foo: unknown }>(obj);
1010
}
1111
const obj2 = { foo: 123 };
1212
if (Object.hasOwn(obj2, "bar")) {
@@ -31,3 +31,17 @@ import { expectError, expectType } from "tsd";
3131
expectType<{}>(emptyObj);
3232
}
3333
}
34+
35+
// https://github.com/uhyo/better-typescript-lib/issues/13
36+
{
37+
const protoObj = { protoProp: 'protoProp' };
38+
39+
const obj: Record<string, string> = Object.create(protoObj);
40+
obj.ownProp = 'ownProp';
41+
42+
for (const key in obj) {
43+
if (!Object.hasOwn(obj, key)) continue;
44+
expectType<Record<string, string>>(obj);
45+
obj[key];
46+
}
47+
}

tests/src/es5.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ expectType<{ foo: number; bar: string; baz: boolean }>(
4343
const obj: object = {};
4444
if (obj.hasOwnProperty("foo")) {
4545
expectType<unknown>(obj.foo);
46-
expectType<{ foo: unknown }>(obj);
46+
expectType<object & { foo: unknown }>(obj);
4747
}
4848
const obj2 = { foo: 123 };
4949
if (obj2.hasOwnProperty("bar")) {
@@ -69,6 +69,20 @@ expectType<{ foo: number; bar: string; baz: boolean }>(
6969
}
7070
}
7171

72+
// https://github.com/uhyo/better-typescript-lib/issues/13
73+
{
74+
const protoObj = { protoProp: 'protoProp' };
75+
76+
const obj: Record<string, string> = Object.create(protoObj);
77+
obj.ownProp = 'ownProp';
78+
79+
for (const key in obj) {
80+
if (!obj.hasOwnProperty(key)) continue;
81+
expectType<Record<string, string>>(obj);
82+
obj[key];
83+
}
84+
}
85+
7286
// ObjectConstructor
7387
{
7488
// Object.defineProperty
@@ -309,4 +323,5 @@ expectType<{ foo: number; bar: string; baz: boolean }>(
309323
}
310324
}
311325

312-
export {};
326+
export { };
327+

0 commit comments

Comments
 (0)