diff --git a/tests/cases/compiler/contravariantInferenceAndTypeGuard.ts b/tests/cases/compiler/contravariantInferenceAndTypeGuard.ts new file mode 100644 index 00000000000..a1bcf4ae25d --- /dev/null +++ b/tests/cases/compiler/contravariantInferenceAndTypeGuard.ts @@ -0,0 +1,27 @@ +// @strict: true +interface ListItem { + prev: ListItem | null; + next: ListItem | null; + data: TData; +} +type IteratorFn> = (this: TContext, item: TData, node: ListItem, list: List) => TResult; +type FilterFn> = (this: TContext, item: TData, node: ListItem, list: List) => item is TResult; + +declare class List { + filter(fn: FilterFn, context: TContext): List; + filter(fn: FilterFn): List; + filter(fn: IteratorFn, context: TContext): List; + filter(fn: IteratorFn): List; +} +interface Test { + a: string; +} +const list2 = new List(); +const filter1 = list2.filter(function(item, node, list): item is Test { + this.b; // $ExpectType string + item; // $ExpectType Test | null + node; // $ExpectType ListItem + list; // $ExpectType List + return !!item; +}, {b: 'c'}); +const x: List = filter1; // $ExpectType List