// @strict: true // @declaration: true // Repros from #47599 declare function callIt(obj: { produce: (n: number) => T, consume: (x: T) => void }): void; callIt({ produce: () => 0, consume: n => n.toFixed() }); callIt({ produce: _a => 0, consume: n => n.toFixed(), }); callIt({ produce() { return 0; }, consume: n => n.toFixed() }); declare function callItT(obj: [(n: number) => T, (x: T) => void]): void; callItT([() => 0, n => n.toFixed()]); callItT([_a => 0, n => n.toFixed()]); // Repro from #25092 interface MyInterface { retrieveGeneric: (parameter: string) => T, operateWithGeneric: (generic: T) => string } const inferTypeFn = (generic: MyInterface) => generic; const myGeneric = inferTypeFn({ retrieveGeneric: parameter => 5, operateWithGeneric: generic => generic.toFixed() }); // Repro #38623 function make(o: { mutations: M, action: (m: M) => void }) { } make({ mutations: { foo() { } }, action: (a) => { a.foo() } }); // Repro from #38845 declare function foo(options: { a: A, b: (a: A) => void }): void; foo({ a: () => { return 42 }, b(a) {}, }); foo({ a: function () { return 42 }, b(a) {}, }); foo({ a() { return 42 }, b(a) {}, }); // Repro from #38872 type Chain = { a(): R1, b(a: R1): R2; c(b: R2): void; }; function test(foo: Chain) {} test({ a: () => 0, b: (a) => 'a', c: (b) => { const x: string = b; } }); test({ a: () => 0, b: (a) => a, c: (b) => { const x: number = b; } }); // Repro from #41712 class Wrapper { public value?: T; } type WrappedMap = Record; type Unwrap = { [K in keyof D]: D[K] extends Wrapper ? T : never; }; type MappingComponent = { setup(): { inputs: I; outputs: O }; map?: (inputs: Unwrap) => Unwrap; }; declare function createMappingComponent(def: MappingComponent): void; createMappingComponent({ setup() { return { inputs: { num: new Wrapper(), str: new Wrapper() }, outputs: { bool: new Wrapper(), str: new Wrapper() } }; }, map(inputs) { return { bool: inputs.nonexistent, str: inputs.num, // Causes error } } }); // Repro from #48279 function simplified(props: { generator: () => T, receiver: (t: T) => any }) {} function whatIWant(props: { generator: (bob: any) => T, receiver: (t: T) => any }) {} function nonObject(generator: (bob: any) => T, receiver: (t: T) => any) {} simplified({ generator: () => 123, receiver: (t) => console.log(t + 2) }) whatIWant({ generator: (bob) => bob ? 1 : 2, receiver: (t) => console.log(t + 2) }) nonObject((bob) => bob ? 1 : 2, (t) => console.log(t + 2)) // Repro from #48466 interface Opts { fetch: (params: TParams, foo: number) => TDone, map: (data: TDone) => TMapped } function example(options: Opts) { return (params: TParams) => { const data = options.fetch(params, 123) return options.map(data) } } interface Params { one: number two: string } example({ fetch: (params: Params) => 123, map: (number) => String(number) }); example({ fetch: (params: Params, foo: number) => 123, map: (number) => String(number) }); example({ fetch: (params: Params, foo) => 123, map: (number) => String(number) }); // Repro from #45255 declare const branch: (_: { test: T, if: (t: T) => t is U, then: (u: U) => void }) => void declare const x: "a" | "b" branch({ test: x, if: (t): t is "a" => t === "a", then: u => { let test1: "a" = u } })