@@ -27,8 +27,10 @@ type AddEndIfDynamic<T extends string> = AddEnd<T> extends T ? AddEnd<T> : T
2727export interface AnyDeepKeyAndValue <
2828 K extends string = string ,
2929 V extends any = any ,
30+ L extends string = string ,
3031> {
3132 key : K
33+ lookup : L
3234 value : V
3335}
3436
@@ -40,6 +42,7 @@ export interface ArrayDeepKeyAndValue<
4042 in out T extends ReadonlyArray < any > ,
4143> extends AnyDeepKeyAndValue {
4244 key : ArrayAccessor < TParent >
45+ lookup : ArrayAccessor < TParent >
4346 value : T [ number ] | Nullable < TParent [ 'value' ] >
4447}
4548
@@ -64,6 +67,7 @@ export interface TupleDeepKeyAndValue<
6467 in out TKey extends AllTupleKeys < T > ,
6568> extends AnyDeepKeyAndValue {
6669 key : TupleAccessor < TParent , TKey >
70+ lookup : TupleAccessor < TParent , TKey >
6771 value : T [ TKey ] | Nullable < TParent [ 'value' ] >
6872}
6973
@@ -105,6 +109,7 @@ export interface ObjectDeepKeyAndValue<
105109 in out TKey extends AllObjectKeys < T > ,
106110> extends AnyDeepKeyAndValue {
107111 key : ObjectAccessor < TParent , TKey >
112+ lookup : AddEndIfDynamic < ObjectAccessor < TParent , TKey > >
108113 value : ObjectValue < TParent , T , TKey >
109114}
110115
@@ -127,6 +132,7 @@ export type UnknownAccessor<TParent extends AnyDeepKeyAndValue> =
127132export interface UnknownDeepKeyAndValue < TParent extends AnyDeepKeyAndValue >
128133 extends AnyDeepKeyAndValue {
129134 key : UnknownAccessor < TParent >
135+ lookup : UnknownAccessor < TParent >
130136 value : unknown
131137}
132138
@@ -163,22 +169,24 @@ export type DeepKeys<T> = unknown extends T
163169 : DeepKeysAndValues < T > [ 'key' ]
164170
165171type DeepRecord < T > = {
166- [ K in DeepKeysAndValues < T > as AddEndIfDynamic < K [ 'key' ] > ] : K [ 'value' ]
172+ [ K in DeepKeysAndValues < T > as K [ 'lookup' ] ] : K [ 'value' ]
167173}
168174
169175type DeepValueImpl <
170176 TDeepRecord extends DeepRecord < unknown > ,
171- TAccessor extends string ,
172- > = [ TAccessor ] extends [ keyof TDeepRecord ]
173- ? TDeepRecord [ TAccessor ]
174- : TDeepRecord [ AddEnd < TAccessor > ]
177+ TAccessor extends DeepKeys < unknown > ,
178+ > = TDeepRecord [ TAccessor ] extends never
179+ ? TDeepRecord [ AddEnd < TAccessor > ]
180+ : TDeepRecord [ TAccessor ]
175181
176182/**
177183 * Infer the type of a deeply nested property within an object or an array.
178184 */
179185export type DeepValue < TValue , TAccessor extends string > = unknown extends TValue
180186 ? TValue
181- : DeepValueImpl < DeepRecord < TValue > , TAccessor >
187+ : TAccessor extends DeepKeys < TValue >
188+ ? DeepValueImpl < DeepRecord < TValue > , TAccessor >
189+ : never
182190
183191type Foo = {
184192 a : string
0 commit comments