@@ -250,3 +250,45 @@ class OtherPerson {
250
250
return getProperty ( this , "parts" )
251
251
}
252
252
}
253
+
254
+ // Modified repro from #12544
255
+
256
+ function path < T , K1 extends keyof T > ( obj : T , key1 : K1 ) : T [ K1 ] ;
257
+ function path < T , K1 extends keyof T , K2 extends keyof T [ K1 ] > ( obj : T , key1 : K1 , key2 : K2 ) : T [ K1 ] [ K2 ] ;
258
+ function path < T , K1 extends keyof T , K2 extends keyof T [ K1 ] , K3 extends keyof T [ K1 ] [ K2 ] > ( obj : T , key1 : K1 , key2 : K2 , key3 : K3 ) : T [ K1 ] [ K2 ] [ K3 ] ;
259
+ function path ( obj : any , ...keys : ( string | number ) [ ] ) : any ;
260
+ function path ( obj : any , ...keys : ( string | number ) [ ] ) : any {
261
+ let result = obj ;
262
+ for ( let k of keys ) {
263
+ result = result [ k ] ;
264
+ }
265
+ return result ;
266
+ }
267
+
268
+ type Thing = {
269
+ a : { x : number , y : string } ,
270
+ b : boolean
271
+ } ;
272
+
273
+
274
+ function f1 ( thing : Thing ) {
275
+ let x1 = path ( thing , 'a' ) ; // { x: number, y: string }
276
+ let x2 = path ( thing , 'a' , 'y' ) ; // string
277
+ let x3 = path ( thing , 'b' ) ; // boolean
278
+ let x4 = path ( thing , ...[ 'a' , 'x' ] ) ; // any
279
+ }
280
+
281
+ // Repro from comment in #12114
282
+
283
+ const assignTo2 = < T , K1 extends keyof T , K2 extends keyof T [ K1 ] > ( object : T , key1 : K1 , key2 : K2 ) =>
284
+ ( value : T [ K1 ] [ K2 ] ) => object [ key1 ] [ key2 ] = value ;
285
+
286
+ // Modified repro from #12573
287
+
288
+ declare function one < T > ( handler : ( t : T ) => void ) : T
289
+ var empty = one ( ( ) => { } ) // inferred as {}, expected
290
+
291
+ type Handlers < T > = { [ K in keyof T ] : ( t : T [ K ] ) => void }
292
+ declare function on < T > ( handlerHash : Handlers < T > ) : T
293
+ var hashOfEmpty1 = on ( { test : ( ) => { } } ) ; // {}
294
+ var hashOfEmpty2 = on ( { test : ( x : boolean ) => { } } ) ; // { test: boolean }
0 commit comments