<!-- BUGS: Please use this template. --> <!-- QUESTIONS: This is not a general support forum! Ask Qs at http://stackoverflow.com/questions/tagged/typescript --> <!-- SUGGESTIONS: See https://github.com/Microsoft/TypeScript-wiki/blob/master/Writing-Good-Design-Proposals.md --> <!-- Please try to reproduce the issue with `typescript@next`. It may have already been fixed. --> **TypeScript Version:** 2.6.1 **Code** ```ts interface Animal { } interface Cat extends Animal { meow(): void; } interface Dog extends Animal { bark(): void; } function isCat(animal: Animal): animal is Cat { return animal.hasOwnProperty("meow"); } function isDog(animal: Animal): animal is Dog { return animal.hasOwnProperty("bark"); } let animals: Animal[]; const cats: Cat[] = animals.filter(isCat); // OK const cats2: Cat[] = animals.filter(a => isCat(a)); // Type error ``` **Expected behavior:** No errors **Actual behavior:** Error at `cats2`: ``` [ts] Type 'Animal[]' is not assignable to type 'Cat[]'. Type 'Animal' is not assignable to type 'Cat'. Property 'meow' is missing in type 'Animal'. ``` The first call to `filter` on `animals` resolves to the function ```ts filter<S extends T>(callbackfn: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[]; ``` while the second call resolves to: ```ts filter(callbackfn: (value: T, index: number, array: T[]) => any, thisArg?: any): T[]; ```