From b6aff98fd7fbb78532de718ff561f26fb7c43c61 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 17 Mar 2019 17:39:08 -1000 Subject: [PATCH] Add test relating type predicates with and without this parameters --- .../contravariantInferenceAndTypeGuard.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/cases/compiler/contravariantInferenceAndTypeGuard.ts 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