Skip to content

Commit b13a706

Browse files
committed
[#79] Patches GetIndexField<>
1 parent 3b21648 commit b13a706

3 files changed

Lines changed: 53 additions & 4 deletions

File tree

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
install-and-test: &install-and-test
22
- checkout
33
- restore_cache:
4-
key: node-modules-1-{{ checksum "package-lock.json" }}-{{ checksum "docs/package-lock.json" }}
4+
key: node-modules-2-{{ checksum "package-lock.json" }}-{{ checksum "docs/package-lock.json" }}
55
- run: npm install && cd docs && npm install
66
- save_cache:
7-
key: node-modules-1-{{ checksum "package-lock.json" }}-{{ checksum "docs/package-lock.json" }}
7+
key: node-modules-2-{{ checksum "package-lock.json" }}-{{ checksum "docs/package-lock.json" }}
88
paths:
99
- node_modules
1010
- docs/node_modules

__tests__/ts-types/utils/value-at-path.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,24 @@ test('type resolution with [] brackets in path', () => {
8282
expect<ValueAtPathT<StateT, `a[${string}][${string}]`, never>>()
8383
.type.toEqual<string | undefined>();
8484
});
85+
86+
// Test related to: https://github.com/birdofpreyru/react-global-state/issues/79
87+
test('type resolution with number keys', () => {
88+
type StateT = Record<string, string>;
89+
90+
expect<StateT[string]>().type.toEqual<string>();
91+
92+
// It works because for JavaScript objects numeric keys are converted
93+
// to their string representations anyway, and TypeScript knows it.
94+
expect<StateT[number]>().type.toEqual<string>();
95+
96+
// GetFieldType<> must follow the TypeScript behavior above.
97+
expect<GetFieldType<StateT, string>>().type.toEqual<string>();
98+
expect<GetFieldType<StateT, number>>().type.toEqual<string>();
99+
expect<GetFieldType<StateT, `[${number}]`>>().type.toEqual<string>();
100+
101+
type ArrT = string[];
102+
expect<ArrT[1]>().type.toEqual<string>();
103+
expect<GetFieldType<ArrT, number>>().type.toEqual<string>();
104+
// expect<GetFieldType<ArrT, `[${number}]`>>().type.toEqual<string>();
105+
});

patches/@types+lodash+4.17.4.patch

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,36 @@
11
diff --git a/node_modules/@types/lodash/common/object.d.ts b/node_modules/@types/lodash/common/object.d.ts
2-
index 69552b0..2c10bea 100644
2+
index 69552b0..7e88e0c 100644
33
--- a/node_modules/@types/lodash/common/object.d.ts
44
+++ b/node_modules/@types/lodash/common/object.d.ts
5-
@@ -1051,9 +1051,11 @@ declare module "../index" {
5+
@@ -1021,17 +1021,19 @@ declare module "../index" {
6+
functionsIn(): CollectionChain<string>;
7+
}
8+
9+
- type GetIndexedField<T, K> = K extends keyof T
10+
- ? T[K]
11+
- : K extends `${number}`
12+
- ? 'length' extends keyof T
13+
- ? number extends T['length']
14+
- ? number extends keyof T
15+
- ? T[number]
16+
+ type GetIndexedField<T, K> = K extends string | number | bigint | boolean | null | undefined
17+
+ ? `${K}` extends keyof T
18+
+ ? T[`${K}`]
19+
+ : K extends `${number}`
20+
+ ? 'length' extends keyof T
21+
+ ? number extends T['length']
22+
+ ? number extends keyof T
23+
+ ? T[number]
24+
+ : undefined
25+
: undefined
26+
: undefined
27+
: undefined
28+
- : undefined;
29+
+ : undefined;
30+
31+
type FieldWithPossiblyUndefined<T, Key> =
32+
| GetFieldType<Exclude<T, undefined>, Key>
33+
@@ -1051,9 +1053,11 @@ declare module "../index" {
634
: undefined
735
: P extends keyof T
836
? T[P]

0 commit comments

Comments
 (0)