diff --git a/tests/baselines/reference/contravariantInferenceAndTypeGuard.js b/tests/baselines/reference/contravariantInferenceAndTypeGuard.js new file mode 100644 index 0000000000..a56fdacf8c --- /dev/null +++ b/tests/baselines/reference/contravariantInferenceAndTypeGuard.js @@ -0,0 +1,40 @@ +//// [contravariantInferenceAndTypeGuard.ts] +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 + + +//// [contravariantInferenceAndTypeGuard.js] +"use strict"; +var list2 = new List(); +var filter1 = list2.filter(function (item, node, list) { + this.b; // $ExpectType string + item; // $ExpectType Test | null + node; // $ExpectType ListItem + list; // $ExpectType List + return !!item; +}, { b: 'c' }); +var x = filter1; // $ExpectType List diff --git a/tests/baselines/reference/contravariantInferenceAndTypeGuard.symbols b/tests/baselines/reference/contravariantInferenceAndTypeGuard.symbols new file mode 100644 index 0000000000..bee31fb1bf --- /dev/null +++ b/tests/baselines/reference/contravariantInferenceAndTypeGuard.symbols @@ -0,0 +1,157 @@ +=== tests/cases/compiler/contravariantInferenceAndTypeGuard.ts === +interface ListItem { +>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19)) + + prev: ListItem | null; +>prev : Symbol(ListItem.prev, Decl(contravariantInferenceAndTypeGuard.ts, 0, 27)) +>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19)) + + next: ListItem | null; +>next : Symbol(ListItem.next, Decl(contravariantInferenceAndTypeGuard.ts, 1, 33)) +>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19)) + + data: TData; +>data : Symbol(ListItem.data, Decl(contravariantInferenceAndTypeGuard.ts, 2, 33)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19)) +} +type IteratorFn> = (this: TContext, item: TData, node: ListItem, list: List) => TResult; +>IteratorFn : Symbol(IteratorFn, Decl(contravariantInferenceAndTypeGuard.ts, 4, 1)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 5, 22)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 5, 31)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16)) +>this : Symbol(this, Decl(contravariantInferenceAndTypeGuard.ts, 5, 59)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 5, 31)) +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 5, 74)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16)) +>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 5, 87)) +>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16)) +>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 5, 110)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 5, 22)) + +type FilterFn> = (this: TContext, item: TData, node: ListItem, list: List) => item is TResult; +>FilterFn : Symbol(FilterFn, Decl(contravariantInferenceAndTypeGuard.ts, 5, 141)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 6, 20)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 6, 43)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14)) +>this : Symbol(this, Decl(contravariantInferenceAndTypeGuard.ts, 6, 71)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 6, 43)) +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 6, 86)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14)) +>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 6, 99)) +>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14)) +>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 6, 122)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14)) +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 6, 86)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 6, 20)) + +declare class List { +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) + + filter(fn: FilterFn, context: TContext): List; +>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 9, 11)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 9, 20)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 9, 44)) +>FilterFn : Symbol(FilterFn, Decl(contravariantInferenceAndTypeGuard.ts, 5, 141)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 9, 20)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 9, 11)) +>context : Symbol(context, Decl(contravariantInferenceAndTypeGuard.ts, 9, 83)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 9, 11)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 9, 20)) + + filter(fn: FilterFn): List; +>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 10, 11)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 10, 34)) +>FilterFn : Symbol(FilterFn, Decl(contravariantInferenceAndTypeGuard.ts, 5, 141)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 10, 11)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 10, 11)) + + filter(fn: IteratorFn, context: TContext): List; +>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 11, 11)) +>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 11, 21)) +>IteratorFn : Symbol(IteratorFn, Decl(contravariantInferenceAndTypeGuard.ts, 4, 1)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 11, 11)) +>context : Symbol(context, Decl(contravariantInferenceAndTypeGuard.ts, 11, 62)) +>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 11, 11)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) + + filter(fn: IteratorFn): List; +>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95)) +>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 12, 11)) +>IteratorFn : Symbol(IteratorFn, Decl(contravariantInferenceAndTypeGuard.ts, 4, 1)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19)) +} +interface Test { +>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1)) + + a: string; +>a : Symbol(Test.a, Decl(contravariantInferenceAndTypeGuard.ts, 14, 16)) +} +const list2 = new List(); +>list2 : Symbol(list2, Decl(contravariantInferenceAndTypeGuard.ts, 17, 5)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1)) + +const filter1 = list2.filter(function(item, node, list): item is Test { +>filter1 : Symbol(filter1, Decl(contravariantInferenceAndTypeGuard.ts, 18, 5)) +>list2.filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95)) +>list2 : Symbol(list2, Decl(contravariantInferenceAndTypeGuard.ts, 17, 5)) +>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95)) +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38)) +>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 18, 43)) +>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 18, 49)) +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38)) +>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1)) + + this.b; // $ExpectType string +>this.b : Symbol(b, Decl(contravariantInferenceAndTypeGuard.ts, 24, 4)) +>this : Symbol(this, Decl(contravariantInferenceAndTypeGuard.ts, 6, 71)) +>b : Symbol(b, Decl(contravariantInferenceAndTypeGuard.ts, 24, 4)) + + item; // $ExpectType Test | null +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38)) + + node; // $ExpectType ListItem +>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 18, 43)) + + list; // $ExpectType List +>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 18, 49)) + + return !!item; +>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38)) + +}, {b: 'c'}); +>b : Symbol(b, Decl(contravariantInferenceAndTypeGuard.ts, 24, 4)) + +const x: List = filter1; // $ExpectType List +>x : Symbol(x, Decl(contravariantInferenceAndTypeGuard.ts, 25, 5)) +>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161)) +>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1)) +>filter1 : Symbol(filter1, Decl(contravariantInferenceAndTypeGuard.ts, 18, 5)) + diff --git a/tests/baselines/reference/contravariantInferenceAndTypeGuard.types b/tests/baselines/reference/contravariantInferenceAndTypeGuard.types new file mode 100644 index 0000000000..d0b139a5a7 --- /dev/null +++ b/tests/baselines/reference/contravariantInferenceAndTypeGuard.types @@ -0,0 +1,97 @@ +=== tests/cases/compiler/contravariantInferenceAndTypeGuard.ts === +interface ListItem { + prev: ListItem | null; +>prev : ListItem | null +>null : null + + next: ListItem | null; +>next : ListItem | null +>null : null + + data: TData; +>data : TData +} +type IteratorFn> = (this: TContext, item: TData, node: ListItem, list: List) => TResult; +>IteratorFn : IteratorFn +>this : TContext +>item : TData +>node : ListItem +>list : List + +type FilterFn> = (this: TContext, item: TData, node: ListItem, list: List) => item is TResult; +>FilterFn : FilterFn +>this : TContext +>item : TData +>node : ListItem +>list : List + +declare class List { +>List : List + + filter(fn: FilterFn, context: TContext): List; +>filter : { (fn: FilterFn, context: TContext): List; (fn: FilterFn>): List; (fn: IteratorFn, context: TContext): List; (fn: IteratorFn>): List; } +>fn : FilterFn +>context : TContext + + filter(fn: FilterFn): List; +>filter : { (fn: FilterFn, context: TContext): List; (fn: FilterFn>): List; (fn: IteratorFn, context: TContext): List; (fn: IteratorFn>): List; } +>fn : FilterFn> + + filter(fn: IteratorFn, context: TContext): List; +>filter : { (fn: FilterFn, context: TContext): List; (fn: FilterFn>): List; (fn: IteratorFn, context: TContext): List; (fn: IteratorFn>): List; } +>fn : IteratorFn +>context : TContext + + filter(fn: IteratorFn): List; +>filter : { (fn: FilterFn, context: TContext): List; (fn: FilterFn>): List; (fn: IteratorFn, context: TContext): List; (fn: IteratorFn>): List; } +>fn : IteratorFn> +} +interface Test { + a: string; +>a : string +} +const list2 = new List(); +>list2 : List +>new List() : List +>List : typeof List +>null : null + +const filter1 = list2.filter(function(item, node, list): item is Test { +>filter1 : List +>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'}) : List +>list2.filter : { (fn: FilterFn, context: TContext): List; (fn: FilterFn>): List; (fn: IteratorFn, context: TContext): List; (fn: IteratorFn>): List; } +>list2 : List +>filter : { (fn: FilterFn, context: TContext): List; (fn: FilterFn>): List; (fn: IteratorFn, context: TContext): List; (fn: IteratorFn>): List; } +>function(item, node, list): item is Test { this.b; // $ExpectType string item; // $ExpectType Test | null node; // $ExpectType ListItem list; // $ExpectType List return !!item;} : (this: { b: string; }, item: Test | null, node: ListItem, list: List) => item is Test +>item : Test | null +>node : ListItem +>list : List + + this.b; // $ExpectType string +>this.b : string +>this : { b: string; } +>b : string + + item; // $ExpectType Test | null +>item : Test | null + + node; // $ExpectType ListItem +>node : ListItem + + list; // $ExpectType List +>list : List + + return !!item; +>!!item : boolean +>!item : boolean +>item : Test | null + +}, {b: 'c'}); +>{b: 'c'} : { b: string; } +>b : string +>'c' : "c" + +const x: List = filter1; // $ExpectType List +>x : List +>filter1 : List +