@@ -43,6 +43,39 @@ type regexpIsPrimitive3 = genericIsPrimitive3(RegExp)
43
43
44
44
type map = < Fn extends ( v : T ) => any , O extends { [ k : string ] : T } , T > ( fn : Fn , obj : O ) => { [ P in keyof O ] : Fn ( O [ P ] ) } ;
45
45
type z = map ( < T > (v: T) => [ T ] , { a : 1 , b : 2 , c : 3 } ) ;
46
+ declare function map < Fn extends ( v : T ) = > any , O extends { [ k : string ] : T } , T > ( fn : Fn , obj : O ) : map ( Fn , O ) ;
47
+ // let z = map(<T>(v: T) => [T], { a: 1, b: 2, c: 3 });
48
+ // // fails with error: Cannot read property 'parent' of undefined at createDiagnosticForNodeFromMessageChain
49
+
50
+ type Inc = { [ k : string ] : string ; 0 :'1' , 1 :'2' , 2 :'3' , 3 :'4' , 4 :'5' , 5 :'6' , 6 :'7' , 7 :'8' , 8 :'9' } ;
51
+ type StringToNumber = { [ k : string ] : number ; 0 :0 , 1 :1 , 2 :2 , 3 :3 , 4 :4 , 5 :5 , 6 :6 , 7 :7 , 8 :8 } ;
52
+ type TupleHasIndex < Arr extends any [ ] , I extends string > = ( { [ K in keyof Arr ] : '1' } & { [ k : string ] : '0' } ) [ I ] ;
53
+ type PathFn < T extends { [ k : string ] : any } , R extends Array < string > , I extends string = '0' > =
54
+ { 1 : PathFn < T [ R [ StringToNumber [ I ] ] ] , R, Inc [ I ] > , 0 : T } [ TupleHasIndex < R , I > ] ;
55
+ type PathTest = PathFn < { a : { b : [ 'c' , { d : 'e' } ] } } , [ 'a' , 'b' , '1' , 'd' ] > ;
56
+ declare function path < T extends { [ k : string ] : any } , R extends Array < string >> ( obj : T , path : R ) : PathFn < T , R > ;
57
+ const obj = null ! as { a : { b : [ 'c' , { d : 'e' } ] } } ;
58
+ const keys = null ! as [ 'a' , 'b' , '1' , 'd' ] ;
59
+ const pathTest = path ( obj , keys ) ;
60
+ // "e"
61
+
62
+ // type Reduce<
63
+ // Fn extends (previousValue: T, currentValue: R[number], currentIndex?: number, array?: R) => any,
64
+ // T,
65
+ // R extends any[],
66
+ // I extends string = '0'
67
+ // > = { 1: Reduce<Fn(T, R[StringToNumber[I]], I, R), R, Inc[I]>, 0: T }[TupleHasIndex<R, I>];
68
+ // // fails with error: Cannot read property 'kind' of undefined at resolveCall
69
+ // declare function reduce<
70
+ // Fn extends (previousValue: any, currentValue: R[number], currentIndex?: number, array?: R) => any,
71
+ // R extends any[],
72
+ // U,
73
+ // I extends string = '0'
74
+ // >(callbackfn: Fn, initialValue: U, array: R): Reduce<Fn, U, R>;
75
+ // declare function path2<T extends { [k: string]: any }, R extends Array<string>>(obj: T, path: R):
76
+ // Reduce<<Prev, Curr>(previousValue: Prev, currentValue: Curr, currentIndex?: number, array?: any[]) => Prev[Curr], T, R>;
77
+ // const pathTest2 = path2(obj, keys);
78
+ // // "e"
46
79
47
80
// binary function composition
48
81
type Fn1 = < T1 extends number > (v1: T1[]) => { [ k : string ] : T1 } ;
@@ -172,6 +205,9 @@ function comparability<T>(x: T, y: () => T) {
172
205
173
206
//// [typeCall.js]
174
207
var a = 'foo' ;
208
+ var obj = null ;
209
+ var keys = null ;
210
+ var pathTest = path ( obj , keys ) ;
175
211
var fn1 = null ;
176
212
var fn2 = null ;
177
213
// type Fn4 = Fn3(1); // errors, ok
0 commit comments