<!-- Please try to reproduce the issue with `typescript@next`. It may have already been fixed. --> **TypeScript Version:** 3.1 <!-- Search terms you tried before logging this (so others can find this issue more easily) --> **Search Terms:** type inferrence **Code** ```ts function reduceToPromise<T extends string>(promise: Promise<T>, items: string[]){ return promise } const initialPromise: Promise<string> = {} as any; const items: string[][] = []; const reducedOne = items.reduce(reduceToPromise, initialPromise); const reducedTwo = items.reduce((promise, items) => reduceToPromise(promise, items), initialPromise); ``` [Playground](http://www.typescriptlang.org/play/#src=%0D%0A%0D%0Afunction%20reduceToPromise%3CT%20extends%20string%3E(promise%3A%20Promise%3CT%3E%2C%20items%3A%20string%5B%5D)%7B%0D%0A%20%20%20%20return%20promise%0D%0A%7D%0D%0A%0D%0Aconst%20initialPromise%3A%20Promise%3Cstring%3E%20%3D%20%7B%7D%20as%20any%3B%0D%0A%0D%0Aconst%20items%3A%20string%5B%5D%5B%5D%20%3D%20%5B%5D%3B%0D%0A%0D%0Aconst%20reducedOne%20%3D%20items.reduce(reduceToPromise%2C%20initialPromise)%3B%0D%0A%0D%0Aconst%20reducedTwo%20%3D%20items.reduce((promise%2C%20items)%20%3D%3E%20reduceToPromise(promise%2C%20items)%2C%20initialPromise)%3B%0D%0A) **Expected behavior:** Both `reducedOne` and `reducedTwo` should be typed as `Promise<string>` **Actual behavior:** `reducedOne` is typed as `{}` This issue only occurs when the function has a generic type. This works fine: ```ts function reduceToPromise(promise: Promise<string>, items: string[]){ return promise } const initialPromise: Promise<string> = {} as any; const items: string[][] = []; const reduced = items.reduce(reduceToPromise, initialPromise); ``` [Playground](http://www.typescriptlang.org/play/#src=%0D%0A%0D%0Afunction%20reduceToPromise(promise%3A%20Promise%3Cstring%3E%2C%20items%3A%20string%5B%5D)%7B%0D%0A%20%20%20%20return%20promise%0D%0A%7D%0D%0A%0D%0Aconst%20initialPromise%3A%20Promise%3Cstring%3E%20%3D%20%7B%7D%20as%20any%3B%0D%0Aconst%20items%3A%20string%5B%5D%5B%5D%20%3D%20%5B%5D%3B%0D%0A%0D%0Aconst%20reduced%20%3D%20items.reduce(reduceToPromise%2C%20initialPromise)%3B%0D%0A)