@@ -393,3 +393,97 @@ function f10(foo: Foo) {
393393>validateAndClone : Symbol(validateAndClone, Decl(isomorphicMappedTypeInference.ts, 107, 69))
394394>foo : Symbol(foo, Decl(isomorphicMappedTypeInference.ts, 115, 13))
395395}
396+
397+ // Repro from #12606
398+
399+ type Func<T> = (...args: any[]) => T;
400+ >Func : Symbol(Func, Decl(isomorphicMappedTypeInference.ts, 119, 1))
401+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 123, 10))
402+ >args : Symbol(args, Decl(isomorphicMappedTypeInference.ts, 123, 16))
403+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 123, 10))
404+
405+ type Spec<T> = {
406+ >Spec : Symbol(Spec, Decl(isomorphicMappedTypeInference.ts, 123, 37))
407+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 124, 10))
408+
409+ [P in keyof T]: Func<T[P]> | Spec<T[P]> ;
410+ >P : Symbol(P, Decl(isomorphicMappedTypeInference.ts, 125, 5))
411+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 124, 10))
412+ >Func : Symbol(Func, Decl(isomorphicMappedTypeInference.ts, 119, 1))
413+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 124, 10))
414+ >P : Symbol(P, Decl(isomorphicMappedTypeInference.ts, 125, 5))
415+ >Spec : Symbol(Spec, Decl(isomorphicMappedTypeInference.ts, 123, 37))
416+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 124, 10))
417+ >P : Symbol(P, Decl(isomorphicMappedTypeInference.ts, 125, 5))
418+
419+ };
420+
421+ /**
422+ * Given a spec object recursively mapping properties to functions, creates a function
423+ * producing an object of the same structure, by mapping each property to the result
424+ * of calling its associated function with the supplied arguments.
425+ */
426+ declare function applySpec<T>(obj: Spec<T>): (...args: any[]) => T;
427+ >applySpec : Symbol(applySpec, Decl(isomorphicMappedTypeInference.ts, 126, 2))
428+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 133, 27))
429+ >obj : Symbol(obj, Decl(isomorphicMappedTypeInference.ts, 133, 30))
430+ >Spec : Symbol(Spec, Decl(isomorphicMappedTypeInference.ts, 123, 37))
431+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 133, 27))
432+ >args : Symbol(args, Decl(isomorphicMappedTypeInference.ts, 133, 46))
433+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 133, 27))
434+
435+ // Infers g1: (...args: any[]) => { sum: number, nested: { mul: string } }
436+ var g1 = applySpec({
437+ >g1 : Symbol(g1, Decl(isomorphicMappedTypeInference.ts, 136, 3))
438+ >applySpec : Symbol(applySpec, Decl(isomorphicMappedTypeInference.ts, 126, 2))
439+
440+ sum: (a: any) => 3,
441+ >sum : Symbol(sum, Decl(isomorphicMappedTypeInference.ts, 136, 20))
442+ >a : Symbol(a, Decl(isomorphicMappedTypeInference.ts, 137, 10))
443+
444+ nested: {
445+ >nested : Symbol(nested, Decl(isomorphicMappedTypeInference.ts, 137, 23))
446+
447+ mul: (b: any) => "n"
448+ >mul : Symbol(mul, Decl(isomorphicMappedTypeInference.ts, 138, 13))
449+ >b : Symbol(b, Decl(isomorphicMappedTypeInference.ts, 139, 14))
450+ }
451+ });
452+
453+ // Infers g2: (...args: any[]) => { foo: { bar: { baz: boolean } } }
454+ var g2 = applySpec({ foo: { bar: { baz: (x: any) => true } } });
455+ >g2 : Symbol(g2, Decl(isomorphicMappedTypeInference.ts, 144, 3))
456+ >applySpec : Symbol(applySpec, Decl(isomorphicMappedTypeInference.ts, 126, 2))
457+ >foo : Symbol(foo, Decl(isomorphicMappedTypeInference.ts, 144, 20))
458+ >bar : Symbol(bar, Decl(isomorphicMappedTypeInference.ts, 144, 27))
459+ >baz : Symbol(baz, Decl(isomorphicMappedTypeInference.ts, 144, 34))
460+ >x : Symbol(x, Decl(isomorphicMappedTypeInference.ts, 144, 41))
461+
462+ // Repro from #12633
463+
464+ const foo = <T>(object: T, partial: Partial<T>) => object;
465+ >foo : Symbol(foo, Decl(isomorphicMappedTypeInference.ts, 148, 5))
466+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 148, 13))
467+ >object : Symbol(object, Decl(isomorphicMappedTypeInference.ts, 148, 16))
468+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 148, 13))
469+ >partial : Symbol(partial, Decl(isomorphicMappedTypeInference.ts, 148, 26))
470+ >Partial : Symbol(Partial, Decl(lib.d.ts, --, --))
471+ >T : Symbol(T, Decl(isomorphicMappedTypeInference.ts, 148, 13))
472+ >object : Symbol(object, Decl(isomorphicMappedTypeInference.ts, 148, 16))
473+
474+ let o = {a: 5, b: 7};
475+ >o : Symbol(o, Decl(isomorphicMappedTypeInference.ts, 149, 3))
476+ >a : Symbol(a, Decl(isomorphicMappedTypeInference.ts, 149, 9))
477+ >b : Symbol(b, Decl(isomorphicMappedTypeInference.ts, 149, 14))
478+
479+ foo(o, {b: 9});
480+ >foo : Symbol(foo, Decl(isomorphicMappedTypeInference.ts, 148, 5))
481+ >o : Symbol(o, Decl(isomorphicMappedTypeInference.ts, 149, 3))
482+ >b : Symbol(b, Decl(isomorphicMappedTypeInference.ts, 150, 8))
483+
484+ o = foo(o, {b: 9});
485+ >o : Symbol(o, Decl(isomorphicMappedTypeInference.ts, 149, 3))
486+ >foo : Symbol(foo, Decl(isomorphicMappedTypeInference.ts, 148, 5))
487+ >o : Symbol(o, Decl(isomorphicMappedTypeInference.ts, 149, 3))
488+ >b : Symbol(b, Decl(isomorphicMappedTypeInference.ts, 151, 12))
489+
0 commit comments