Skip to content

Commit e9eb73b

Browse files
committed
Accept new baselines
1 parent b6aff98 commit e9eb73b

File tree

3 files changed

+294
-0
lines changed

3 files changed

+294
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//// [contravariantInferenceAndTypeGuard.ts]
2+
interface ListItem<TData> {
3+
prev: ListItem<TData> | null;
4+
next: ListItem<TData> | null;
5+
data: TData;
6+
}
7+
type IteratorFn<TData, TResult, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => TResult;
8+
type FilterFn<TData, TResult extends TData, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => item is TResult;
9+
10+
declare class List<TData> {
11+
filter<TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>;
12+
filter<TResult extends TData>(fn: FilterFn<TData, TResult>): List<TResult>;
13+
filter<TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>;
14+
filter(fn: IteratorFn<TData, boolean>): List<TData>;
15+
}
16+
interface Test {
17+
a: string;
18+
}
19+
const list2 = new List<Test | null>();
20+
const filter1 = list2.filter(function(item, node, list): item is Test {
21+
this.b; // $ExpectType string
22+
item; // $ExpectType Test | null
23+
node; // $ExpectType ListItem<Test | null>
24+
list; // $ExpectType List<Test | null>
25+
return !!item;
26+
}, {b: 'c'});
27+
const x: List<Test> = filter1; // $ExpectType List<Test>
28+
29+
30+
//// [contravariantInferenceAndTypeGuard.js]
31+
"use strict";
32+
var list2 = new List();
33+
var filter1 = list2.filter(function (item, node, list) {
34+
this.b; // $ExpectType string
35+
item; // $ExpectType Test | null
36+
node; // $ExpectType ListItem<Test | null>
37+
list; // $ExpectType List<Test | null>
38+
return !!item;
39+
}, { b: 'c' });
40+
var x = filter1; // $ExpectType List<Test>
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
=== tests/cases/compiler/contravariantInferenceAndTypeGuard.ts ===
2+
interface ListItem<TData> {
3+
>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0))
4+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19))
5+
6+
prev: ListItem<TData> | null;
7+
>prev : Symbol(ListItem.prev, Decl(contravariantInferenceAndTypeGuard.ts, 0, 27))
8+
>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0))
9+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19))
10+
11+
next: ListItem<TData> | null;
12+
>next : Symbol(ListItem.next, Decl(contravariantInferenceAndTypeGuard.ts, 1, 33))
13+
>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0))
14+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19))
15+
16+
data: TData;
17+
>data : Symbol(ListItem.data, Decl(contravariantInferenceAndTypeGuard.ts, 2, 33))
18+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 0, 19))
19+
}
20+
type IteratorFn<TData, TResult, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => TResult;
21+
>IteratorFn : Symbol(IteratorFn, Decl(contravariantInferenceAndTypeGuard.ts, 4, 1))
22+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16))
23+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 5, 22))
24+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 5, 31))
25+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
26+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16))
27+
>this : Symbol(this, Decl(contravariantInferenceAndTypeGuard.ts, 5, 59))
28+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 5, 31))
29+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 5, 74))
30+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16))
31+
>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 5, 87))
32+
>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0))
33+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16))
34+
>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 5, 110))
35+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
36+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 5, 16))
37+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 5, 22))
38+
39+
type FilterFn<TData, TResult extends TData, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => item is TResult;
40+
>FilterFn : Symbol(FilterFn, Decl(contravariantInferenceAndTypeGuard.ts, 5, 141))
41+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14))
42+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 6, 20))
43+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14))
44+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 6, 43))
45+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
46+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14))
47+
>this : Symbol(this, Decl(contravariantInferenceAndTypeGuard.ts, 6, 71))
48+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 6, 43))
49+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 6, 86))
50+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14))
51+
>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 6, 99))
52+
>ListItem : Symbol(ListItem, Decl(contravariantInferenceAndTypeGuard.ts, 0, 0))
53+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14))
54+
>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 6, 122))
55+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
56+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 6, 14))
57+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 6, 86))
58+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 6, 20))
59+
60+
declare class List<TData> {
61+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
62+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
63+
64+
filter<TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>;
65+
>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95))
66+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 9, 11))
67+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 9, 20))
68+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
69+
>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 9, 44))
70+
>FilterFn : Symbol(FilterFn, Decl(contravariantInferenceAndTypeGuard.ts, 5, 141))
71+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
72+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 9, 20))
73+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 9, 11))
74+
>context : Symbol(context, Decl(contravariantInferenceAndTypeGuard.ts, 9, 83))
75+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 9, 11))
76+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
77+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 9, 20))
78+
79+
filter<TResult extends TData>(fn: FilterFn<TData, TResult>): List<TResult>;
80+
>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95))
81+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 10, 11))
82+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
83+
>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 10, 34))
84+
>FilterFn : Symbol(FilterFn, Decl(contravariantInferenceAndTypeGuard.ts, 5, 141))
85+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
86+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 10, 11))
87+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
88+
>TResult : Symbol(TResult, Decl(contravariantInferenceAndTypeGuard.ts, 10, 11))
89+
90+
filter<TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>;
91+
>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95))
92+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 11, 11))
93+
>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 11, 21))
94+
>IteratorFn : Symbol(IteratorFn, Decl(contravariantInferenceAndTypeGuard.ts, 4, 1))
95+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
96+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 11, 11))
97+
>context : Symbol(context, Decl(contravariantInferenceAndTypeGuard.ts, 11, 62))
98+
>TContext : Symbol(TContext, Decl(contravariantInferenceAndTypeGuard.ts, 11, 11))
99+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
100+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
101+
102+
filter(fn: IteratorFn<TData, boolean>): List<TData>;
103+
>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95))
104+
>fn : Symbol(fn, Decl(contravariantInferenceAndTypeGuard.ts, 12, 11))
105+
>IteratorFn : Symbol(IteratorFn, Decl(contravariantInferenceAndTypeGuard.ts, 4, 1))
106+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
107+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
108+
>TData : Symbol(TData, Decl(contravariantInferenceAndTypeGuard.ts, 8, 19))
109+
}
110+
interface Test {
111+
>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1))
112+
113+
a: string;
114+
>a : Symbol(Test.a, Decl(contravariantInferenceAndTypeGuard.ts, 14, 16))
115+
}
116+
const list2 = new List<Test | null>();
117+
>list2 : Symbol(list2, Decl(contravariantInferenceAndTypeGuard.ts, 17, 5))
118+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
119+
>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1))
120+
121+
const filter1 = list2.filter(function(item, node, list): item is Test {
122+
>filter1 : Symbol(filter1, Decl(contravariantInferenceAndTypeGuard.ts, 18, 5))
123+
>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))
124+
>list2 : Symbol(list2, Decl(contravariantInferenceAndTypeGuard.ts, 17, 5))
125+
>filter : Symbol(List.filter, Decl(contravariantInferenceAndTypeGuard.ts, 8, 27), Decl(contravariantInferenceAndTypeGuard.ts, 9, 118), Decl(contravariantInferenceAndTypeGuard.ts, 10, 79), Decl(contravariantInferenceAndTypeGuard.ts, 11, 95))
126+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38))
127+
>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 18, 43))
128+
>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 18, 49))
129+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38))
130+
>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1))
131+
132+
this.b; // $ExpectType string
133+
>this.b : Symbol(b, Decl(contravariantInferenceAndTypeGuard.ts, 24, 4))
134+
>this : Symbol(this, Decl(contravariantInferenceAndTypeGuard.ts, 6, 71))
135+
>b : Symbol(b, Decl(contravariantInferenceAndTypeGuard.ts, 24, 4))
136+
137+
item; // $ExpectType Test | null
138+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38))
139+
140+
node; // $ExpectType ListItem<Test | null>
141+
>node : Symbol(node, Decl(contravariantInferenceAndTypeGuard.ts, 18, 43))
142+
143+
list; // $ExpectType List<Test | null>
144+
>list : Symbol(list, Decl(contravariantInferenceAndTypeGuard.ts, 18, 49))
145+
146+
return !!item;
147+
>item : Symbol(item, Decl(contravariantInferenceAndTypeGuard.ts, 18, 38))
148+
149+
}, {b: 'c'});
150+
>b : Symbol(b, Decl(contravariantInferenceAndTypeGuard.ts, 24, 4))
151+
152+
const x: List<Test> = filter1; // $ExpectType List<Test>
153+
>x : Symbol(x, Decl(contravariantInferenceAndTypeGuard.ts, 25, 5))
154+
>List : Symbol(List, Decl(contravariantInferenceAndTypeGuard.ts, 6, 161))
155+
>Test : Symbol(Test, Decl(contravariantInferenceAndTypeGuard.ts, 13, 1))
156+
>filter1 : Symbol(filter1, Decl(contravariantInferenceAndTypeGuard.ts, 18, 5))
157+
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
=== tests/cases/compiler/contravariantInferenceAndTypeGuard.ts ===
2+
interface ListItem<TData> {
3+
prev: ListItem<TData> | null;
4+
>prev : ListItem<TData> | null
5+
>null : null
6+
7+
next: ListItem<TData> | null;
8+
>next : ListItem<TData> | null
9+
>null : null
10+
11+
data: TData;
12+
>data : TData
13+
}
14+
type IteratorFn<TData, TResult, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => TResult;
15+
>IteratorFn : IteratorFn<TData, TResult, TContext>
16+
>this : TContext
17+
>item : TData
18+
>node : ListItem<TData>
19+
>list : List<TData>
20+
21+
type FilterFn<TData, TResult extends TData, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => item is TResult;
22+
>FilterFn : FilterFn<TData, TResult, TContext>
23+
>this : TContext
24+
>item : TData
25+
>node : ListItem<TData>
26+
>list : List<TData>
27+
28+
declare class List<TData> {
29+
>List : List<TData>
30+
31+
filter<TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>;
32+
>filter : { <TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>; <TResult extends TData>(fn: FilterFn<TData, TResult, List<TData>>): List<TResult>; <TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>; (fn: IteratorFn<TData, boolean, List<TData>>): List<TData>; }
33+
>fn : FilterFn<TData, TResult, TContext>
34+
>context : TContext
35+
36+
filter<TResult extends TData>(fn: FilterFn<TData, TResult>): List<TResult>;
37+
>filter : { <TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>; <TResult extends TData>(fn: FilterFn<TData, TResult, List<TData>>): List<TResult>; <TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>; (fn: IteratorFn<TData, boolean, List<TData>>): List<TData>; }
38+
>fn : FilterFn<TData, TResult, List<TData>>
39+
40+
filter<TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>;
41+
>filter : { <TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>; <TResult extends TData>(fn: FilterFn<TData, TResult, List<TData>>): List<TResult>; <TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>; (fn: IteratorFn<TData, boolean, List<TData>>): List<TData>; }
42+
>fn : IteratorFn<TData, boolean, TContext>
43+
>context : TContext
44+
45+
filter(fn: IteratorFn<TData, boolean>): List<TData>;
46+
>filter : { <TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>; <TResult extends TData>(fn: FilterFn<TData, TResult, List<TData>>): List<TResult>; <TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>; (fn: IteratorFn<TData, boolean, List<TData>>): List<TData>; }
47+
>fn : IteratorFn<TData, boolean, List<TData>>
48+
}
49+
interface Test {
50+
a: string;
51+
>a : string
52+
}
53+
const list2 = new List<Test | null>();
54+
>list2 : List<Test | null>
55+
>new List<Test | null>() : List<Test | null>
56+
>List : typeof List
57+
>null : null
58+
59+
const filter1 = list2.filter(function(item, node, list): item is Test {
60+
>filter1 : List<Test>
61+
>list2.filter(function(item, node, list): item is Test { this.b; // $ExpectType string item; // $ExpectType Test | null node; // $ExpectType ListItem<Test | null> list; // $ExpectType List<Test | null> return !!item;}, {b: 'c'}) : List<Test>
62+
>list2.filter : { <TContext, TResult extends Test | null>(fn: FilterFn<Test | null, TResult, TContext>, context: TContext): List<TResult>; <TResult extends Test | null>(fn: FilterFn<Test | null, TResult, List<Test | null>>): List<TResult>; <TContext>(fn: IteratorFn<Test | null, boolean, TContext>, context: TContext): List<Test | null>; (fn: IteratorFn<Test | null, boolean, List<Test | null>>): List<Test | null>; }
63+
>list2 : List<Test | null>
64+
>filter : { <TContext, TResult extends Test | null>(fn: FilterFn<Test | null, TResult, TContext>, context: TContext): List<TResult>; <TResult extends Test | null>(fn: FilterFn<Test | null, TResult, List<Test | null>>): List<TResult>; <TContext>(fn: IteratorFn<Test | null, boolean, TContext>, context: TContext): List<Test | null>; (fn: IteratorFn<Test | null, boolean, List<Test | null>>): List<Test | null>; }
65+
>function(item, node, list): item is Test { this.b; // $ExpectType string item; // $ExpectType Test | null node; // $ExpectType ListItem<Test | null> list; // $ExpectType List<Test | null> return !!item;} : (this: { b: string; }, item: Test | null, node: ListItem<Test | null>, list: List<Test | null>) => item is Test
66+
>item : Test | null
67+
>node : ListItem<Test | null>
68+
>list : List<Test | null>
69+
70+
this.b; // $ExpectType string
71+
>this.b : string
72+
>this : { b: string; }
73+
>b : string
74+
75+
item; // $ExpectType Test | null
76+
>item : Test | null
77+
78+
node; // $ExpectType ListItem<Test | null>
79+
>node : ListItem<Test | null>
80+
81+
list; // $ExpectType List<Test | null>
82+
>list : List<Test | null>
83+
84+
return !!item;
85+
>!!item : boolean
86+
>!item : boolean
87+
>item : Test | null
88+
89+
}, {b: 'c'});
90+
>{b: 'c'} : { b: string; }
91+
>b : string
92+
>'c' : "c"
93+
94+
const x: List<Test> = filter1; // $ExpectType List<Test>
95+
>x : List<Test>
96+
>filter1 : List<Test>
97+

0 commit comments

Comments
 (0)