Skip to content

Commit 748d756

Browse files
committed
Add tests and fix spelling
1 parent cc3a48f commit 748d756

File tree

5 files changed

+325
-28
lines changed

5 files changed

+325
-28
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6210,9 +6210,9 @@ namespace ts {
62106210
// If the current type is a union type, remove all constituents that aren't assignable to target. If that produces
62116211
// 0 candidates, fall back to the assignability check
62126212
if (originalType.flags & TypeFlags.Union) {
6213-
let assignableConsituents = filter((<UnionType>originalType).types, t => isTypeAssignableTo(t, narrowedTypeCandidate));
6214-
if (assignableConsituents.length) {
6215-
return getUnionType(assignableConsituents);
6213+
let assignableConstituents = filter((<UnionType>originalType).types, t => isTypeAssignableTo(t, narrowedTypeCandidate));
6214+
if (assignableConstituents.length) {
6215+
return getUnionType(assignableConstituents);
62166216
}
62176217
}
62186218

tests/baselines/reference/instanceOfAssignability.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ class Derived2 implements Base {
1414
optional: number;
1515
}
1616

17+
class Animal {
18+
move;
19+
}
20+
class Mammal extends Animal { milk; }
21+
class Giraffe extends Mammal { neck; }
22+
1723
function fn1(x: Array<number>|Array<string>|boolean) {
1824
if(x instanceof Array) {
1925
// 1.5: y: Array<number>|Array<string>
@@ -53,9 +59,42 @@ function fn5(x: Derived1) {
5359
let y = x;
5460
}
5561
}
62+
63+
function fn6(x: Animal|Mammal) {
64+
if(x instanceof Giraffe) {
65+
// 1.5: y: Derived1
66+
// Want: ???
67+
let y = x;
68+
}
69+
}
70+
71+
function fn7(x: Array<number>|Array<string>) {
72+
if(x instanceof Array) {
73+
// 1.5: y: Array<number>|Array<string>
74+
// Want: y: Array<number>|Array<string>
75+
let y = x;
76+
}
77+
}
78+
79+
interface Alpha { a }
80+
interface Beta { b }
81+
interface Gamma { c }
82+
class ABC { a; b; c; }
83+
function fn8(x: Alpha|Beta|Gamma) {
84+
if(x instanceof ABC) {
85+
let y = x;
86+
}
87+
}
88+
89+
5690

5791

5892
//// [instanceOfAssignability.js]
93+
var __extends = (this && this.__extends) || function (d, b) {
94+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
95+
function __() { this.constructor = d; }
96+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
97+
};
5998
// Derived1 is assignable to, but not a subtype of, Base
6099
var Derived1 = (function () {
61100
function Derived1() {
@@ -68,6 +107,25 @@ var Derived2 = (function () {
68107
}
69108
return Derived2;
70109
})();
110+
var Animal = (function () {
111+
function Animal() {
112+
}
113+
return Animal;
114+
})();
115+
var Mammal = (function (_super) {
116+
__extends(Mammal, _super);
117+
function Mammal() {
118+
_super.apply(this, arguments);
119+
}
120+
return Mammal;
121+
})(Animal);
122+
var Giraffe = (function (_super) {
123+
__extends(Giraffe, _super);
124+
function Giraffe() {
125+
_super.apply(this, arguments);
126+
}
127+
return Giraffe;
128+
})(Mammal);
71129
function fn1(x) {
72130
if (x instanceof Array) {
73131
// 1.5: y: Array<number>|Array<string>
@@ -103,3 +161,27 @@ function fn5(x) {
103161
var y = x;
104162
}
105163
}
164+
function fn6(x) {
165+
if (x instanceof Giraffe) {
166+
// 1.5: y: Derived1
167+
// Want: ???
168+
var y = x;
169+
}
170+
}
171+
function fn7(x) {
172+
if (x instanceof Array) {
173+
// 1.5: y: Array<number>|Array<string>
174+
// Want: y: Array<number>|Array<string>
175+
var y = x;
176+
}
177+
}
178+
var ABC = (function () {
179+
function ABC() {
180+
}
181+
return ABC;
182+
})();
183+
function fn8(x) {
184+
if (x instanceof ABC) {
185+
var y = x;
186+
}
187+
}

tests/baselines/reference/instanceOfAssignability.symbols

Lines changed: 114 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,91 +29,180 @@ class Derived2 implements Base {
2929
>optional : Symbol(optional, Decl(instanceOfAssignability.ts, 11, 13))
3030
}
3131

32+
class Animal {
33+
>Animal : Symbol(Animal, Decl(instanceOfAssignability.ts, 13, 1))
34+
35+
move;
36+
>move : Symbol(move, Decl(instanceOfAssignability.ts, 15, 14))
37+
}
38+
class Mammal extends Animal { milk; }
39+
>Mammal : Symbol(Mammal, Decl(instanceOfAssignability.ts, 17, 1))
40+
>Animal : Symbol(Animal, Decl(instanceOfAssignability.ts, 13, 1))
41+
>milk : Symbol(milk, Decl(instanceOfAssignability.ts, 18, 29))
42+
43+
class Giraffe extends Mammal { neck; }
44+
>Giraffe : Symbol(Giraffe, Decl(instanceOfAssignability.ts, 18, 37))
45+
>Mammal : Symbol(Mammal, Decl(instanceOfAssignability.ts, 17, 1))
46+
>neck : Symbol(neck, Decl(instanceOfAssignability.ts, 19, 30))
47+
3248
function fn1(x: Array<number>|Array<string>|boolean) {
33-
>fn1 : Symbol(fn1, Decl(instanceOfAssignability.ts, 13, 1))
34-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 15, 13))
49+
>fn1 : Symbol(fn1, Decl(instanceOfAssignability.ts, 19, 38))
50+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 21, 13))
3551
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
3652
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
3753

3854
if(x instanceof Array) {
39-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 15, 13))
55+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 21, 13))
4056
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
4157

4258
// 1.5: y: Array<number>|Array<string>
4359
// Want: y: Array<number>|Array<string>
4460
let y = x;
45-
>y : Symbol(y, Decl(instanceOfAssignability.ts, 19, 5))
46-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 15, 13))
61+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 25, 5))
62+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 21, 13))
4763
}
4864
}
4965

5066
function fn2(x: Base) {
51-
>fn2 : Symbol(fn2, Decl(instanceOfAssignability.ts, 21, 1))
52-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 23, 13))
67+
>fn2 : Symbol(fn2, Decl(instanceOfAssignability.ts, 27, 1))
68+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 29, 13))
5369
>Base : Symbol(Base, Decl(instanceOfAssignability.ts, 0, 0))
5470

5571
if(x instanceof Derived1) {
56-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 23, 13))
72+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 29, 13))
5773
>Derived1 : Symbol(Derived1, Decl(instanceOfAssignability.ts, 3, 1))
5874

5975
// 1.5: y: Base
6076
// Want: y: Derived1
6177
let y = x;
62-
>y : Symbol(y, Decl(instanceOfAssignability.ts, 27, 5))
63-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 23, 13))
78+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 33, 5))
79+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 29, 13))
6480
}
6581
}
6682

6783
function fn3(x: Base|Derived1) {
68-
>fn3 : Symbol(fn3, Decl(instanceOfAssignability.ts, 29, 1))
69-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 31, 13))
84+
>fn3 : Symbol(fn3, Decl(instanceOfAssignability.ts, 35, 1))
85+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 37, 13))
7086
>Base : Symbol(Base, Decl(instanceOfAssignability.ts, 0, 0))
7187
>Derived1 : Symbol(Derived1, Decl(instanceOfAssignability.ts, 3, 1))
7288

7389
if(x instanceof Derived2) {
74-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 31, 13))
90+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 37, 13))
7591
>Derived2 : Symbol(Derived2, Decl(instanceOfAssignability.ts, 8, 1))
7692

7793
// 1.5: y: Derived2
7894
// Want: Derived2
7995
let y = x;
80-
>y : Symbol(y, Decl(instanceOfAssignability.ts, 35, 5))
81-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 31, 13))
96+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 41, 5))
97+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 37, 13))
8298
}
8399
}
84100

85101
function fn4(x: Base|Derived2) {
86-
>fn4 : Symbol(fn4, Decl(instanceOfAssignability.ts, 37, 1))
87-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 39, 13))
102+
>fn4 : Symbol(fn4, Decl(instanceOfAssignability.ts, 43, 1))
103+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 45, 13))
88104
>Base : Symbol(Base, Decl(instanceOfAssignability.ts, 0, 0))
89105
>Derived2 : Symbol(Derived2, Decl(instanceOfAssignability.ts, 8, 1))
90106

91107
if(x instanceof Derived1) {
92-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 39, 13))
108+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 45, 13))
93109
>Derived1 : Symbol(Derived1, Decl(instanceOfAssignability.ts, 3, 1))
94110

95111
// 1.5: y: {}
96112
// Want: Derived1
97113
let y = x;
98-
>y : Symbol(y, Decl(instanceOfAssignability.ts, 43, 5))
99-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 39, 13))
114+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 49, 5))
115+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 45, 13))
100116
}
101117
}
102118

103119
function fn5(x: Derived1) {
104-
>fn5 : Symbol(fn5, Decl(instanceOfAssignability.ts, 45, 1))
105-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 47, 13))
120+
>fn5 : Symbol(fn5, Decl(instanceOfAssignability.ts, 51, 1))
121+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 53, 13))
106122
>Derived1 : Symbol(Derived1, Decl(instanceOfAssignability.ts, 3, 1))
107123

108124
if(x instanceof Derived2) {
109-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 47, 13))
125+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 53, 13))
110126
>Derived2 : Symbol(Derived2, Decl(instanceOfAssignability.ts, 8, 1))
111127

112128
// 1.5: y: Derived1
113129
// Want: ???
114130
let y = x;
115-
>y : Symbol(y, Decl(instanceOfAssignability.ts, 51, 5))
116-
>x : Symbol(x, Decl(instanceOfAssignability.ts, 47, 13))
131+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 57, 5))
132+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 53, 13))
133+
}
134+
}
135+
136+
function fn6(x: Animal|Mammal) {
137+
>fn6 : Symbol(fn6, Decl(instanceOfAssignability.ts, 59, 1))
138+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 61, 13))
139+
>Animal : Symbol(Animal, Decl(instanceOfAssignability.ts, 13, 1))
140+
>Mammal : Symbol(Mammal, Decl(instanceOfAssignability.ts, 17, 1))
141+
142+
if(x instanceof Giraffe) {
143+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 61, 13))
144+
>Giraffe : Symbol(Giraffe, Decl(instanceOfAssignability.ts, 18, 37))
145+
146+
// 1.5: y: Derived1
147+
// Want: ???
148+
let y = x;
149+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 65, 5))
150+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 61, 13))
151+
}
152+
}
153+
154+
function fn7(x: Array<number>|Array<string>) {
155+
>fn7 : Symbol(fn7, Decl(instanceOfAssignability.ts, 67, 1))
156+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 69, 13))
157+
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
158+
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
159+
160+
if(x instanceof Array) {
161+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 69, 13))
162+
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
163+
164+
// 1.5: y: Array<number>|Array<string>
165+
// Want: y: Array<number>|Array<string>
166+
let y = x;
167+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 73, 5))
168+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 69, 13))
169+
}
170+
}
171+
172+
interface Alpha { a }
173+
>Alpha : Symbol(Alpha, Decl(instanceOfAssignability.ts, 75, 1))
174+
>a : Symbol(a, Decl(instanceOfAssignability.ts, 77, 17))
175+
176+
interface Beta { b }
177+
>Beta : Symbol(Beta, Decl(instanceOfAssignability.ts, 77, 21))
178+
>b : Symbol(b, Decl(instanceOfAssignability.ts, 78, 16))
179+
180+
interface Gamma { c }
181+
>Gamma : Symbol(Gamma, Decl(instanceOfAssignability.ts, 78, 20))
182+
>c : Symbol(c, Decl(instanceOfAssignability.ts, 79, 17))
183+
184+
class ABC { a; b; c; }
185+
>ABC : Symbol(ABC, Decl(instanceOfAssignability.ts, 79, 21))
186+
>a : Symbol(a, Decl(instanceOfAssignability.ts, 80, 11))
187+
>b : Symbol(b, Decl(instanceOfAssignability.ts, 80, 14))
188+
>c : Symbol(c, Decl(instanceOfAssignability.ts, 80, 17))
189+
190+
function fn8(x: Alpha|Beta|Gamma) {
191+
>fn8 : Symbol(fn8, Decl(instanceOfAssignability.ts, 80, 22))
192+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 81, 13))
193+
>Alpha : Symbol(Alpha, Decl(instanceOfAssignability.ts, 75, 1))
194+
>Beta : Symbol(Beta, Decl(instanceOfAssignability.ts, 77, 21))
195+
>Gamma : Symbol(Gamma, Decl(instanceOfAssignability.ts, 78, 20))
196+
197+
if(x instanceof ABC) {
198+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 81, 13))
199+
>ABC : Symbol(ABC, Decl(instanceOfAssignability.ts, 79, 21))
200+
201+
let y = x;
202+
>y : Symbol(y, Decl(instanceOfAssignability.ts, 83, 5))
203+
>x : Symbol(x, Decl(instanceOfAssignability.ts, 81, 13))
117204
}
118205
}
119206

207+
208+

0 commit comments

Comments
 (0)