Skip to content

Commit 1337f28

Browse files
committed
Add regression tests
1 parent 31d335f commit 1337f28

File tree

4 files changed

+535
-0
lines changed

4 files changed

+535
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
//// [narrowByInstanceof.ts]
2+
interface A { a: string }
3+
interface B { b: string }
4+
interface C { c: string }
5+
6+
type AA = {
7+
(): void;
8+
prototype: A;
9+
}
10+
11+
type BB = {
12+
new(): B;
13+
}
14+
15+
function foo(x: A | B | C, A: AA, B: BB, AB: AA | BB) {
16+
if (x instanceof A) {
17+
x; // A
18+
}
19+
else {
20+
x; // B | C
21+
}
22+
if (x instanceof B) {
23+
x; // B
24+
}
25+
else {
26+
x; // A | C
27+
}
28+
if (x instanceof AB) {
29+
x; // A | B
30+
}
31+
else {
32+
x; // A | B | C
33+
}
34+
}
35+
36+
// Repro from #52571
37+
38+
class PersonMixin extends Function {
39+
public check(o: any) {
40+
return typeof o === "object" && o !== null && o instanceof Person;
41+
}
42+
}
43+
44+
const cls = new PersonMixin();
45+
46+
class Person {
47+
work(): void { console.log("work") }
48+
sayHi(): void { console.log("Hi") }
49+
}
50+
51+
class Car {
52+
sayHi(): void { console.log("Wof Wof") }
53+
}
54+
55+
function test(o: Person | Car) {
56+
if (o instanceof cls) {
57+
console.log("Is Person");
58+
(o as Person).work()
59+
}
60+
else {
61+
console.log("Is Car")
62+
o.sayHi();
63+
}
64+
}
65+
66+
67+
//// [narrowByInstanceof.js]
68+
"use strict";
69+
var __extends = (this && this.__extends) || (function () {
70+
var extendStatics = function (d, b) {
71+
extendStatics = Object.setPrototypeOf ||
72+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
73+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
74+
return extendStatics(d, b);
75+
};
76+
return function (d, b) {
77+
if (typeof b !== "function" && b !== null)
78+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
79+
extendStatics(d, b);
80+
function __() { this.constructor = d; }
81+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
82+
};
83+
})();
84+
function foo(x, A, B, AB) {
85+
if (x instanceof A) {
86+
x; // A
87+
}
88+
else {
89+
x; // B | C
90+
}
91+
if (x instanceof B) {
92+
x; // B
93+
}
94+
else {
95+
x; // A | C
96+
}
97+
if (x instanceof AB) {
98+
x; // A | B
99+
}
100+
else {
101+
x; // A | B | C
102+
}
103+
}
104+
// Repro from #52571
105+
var PersonMixin = /** @class */ (function (_super) {
106+
__extends(PersonMixin, _super);
107+
function PersonMixin() {
108+
return _super !== null && _super.apply(this, arguments) || this;
109+
}
110+
PersonMixin.prototype.check = function (o) {
111+
return typeof o === "object" && o !== null && o instanceof Person;
112+
};
113+
return PersonMixin;
114+
}(Function));
115+
var cls = new PersonMixin();
116+
var Person = /** @class */ (function () {
117+
function Person() {
118+
}
119+
Person.prototype.work = function () { console.log("work"); };
120+
Person.prototype.sayHi = function () { console.log("Hi"); };
121+
return Person;
122+
}());
123+
var Car = /** @class */ (function () {
124+
function Car() {
125+
}
126+
Car.prototype.sayHi = function () { console.log("Wof Wof"); };
127+
return Car;
128+
}());
129+
function test(o) {
130+
if (o instanceof cls) {
131+
console.log("Is Person");
132+
o.work();
133+
}
134+
else {
135+
console.log("Is Car");
136+
o.sayHi();
137+
}
138+
}
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
=== tests/cases/compiler/narrowByInstanceof.ts ===
2+
interface A { a: string }
3+
>A : Symbol(A, Decl(narrowByInstanceof.ts, 0, 0))
4+
>a : Symbol(A.a, Decl(narrowByInstanceof.ts, 0, 13))
5+
6+
interface B { b: string }
7+
>B : Symbol(B, Decl(narrowByInstanceof.ts, 0, 25))
8+
>b : Symbol(B.b, Decl(narrowByInstanceof.ts, 1, 13))
9+
10+
interface C { c: string }
11+
>C : Symbol(C, Decl(narrowByInstanceof.ts, 1, 25))
12+
>c : Symbol(C.c, Decl(narrowByInstanceof.ts, 2, 13))
13+
14+
type AA = {
15+
>AA : Symbol(AA, Decl(narrowByInstanceof.ts, 2, 25))
16+
17+
(): void;
18+
prototype: A;
19+
>prototype : Symbol(prototype, Decl(narrowByInstanceof.ts, 5, 13))
20+
>A : Symbol(A, Decl(narrowByInstanceof.ts, 0, 0))
21+
}
22+
23+
type BB = {
24+
>BB : Symbol(BB, Decl(narrowByInstanceof.ts, 7, 1))
25+
26+
new(): B;
27+
>B : Symbol(B, Decl(narrowByInstanceof.ts, 0, 25))
28+
}
29+
30+
function foo(x: A | B | C, A: AA, B: BB, AB: AA | BB) {
31+
>foo : Symbol(foo, Decl(narrowByInstanceof.ts, 11, 1))
32+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
33+
>A : Symbol(A, Decl(narrowByInstanceof.ts, 0, 0))
34+
>B : Symbol(B, Decl(narrowByInstanceof.ts, 0, 25))
35+
>C : Symbol(C, Decl(narrowByInstanceof.ts, 1, 25))
36+
>A : Symbol(A, Decl(narrowByInstanceof.ts, 13, 26))
37+
>AA : Symbol(AA, Decl(narrowByInstanceof.ts, 2, 25))
38+
>B : Symbol(B, Decl(narrowByInstanceof.ts, 13, 33))
39+
>BB : Symbol(BB, Decl(narrowByInstanceof.ts, 7, 1))
40+
>AB : Symbol(AB, Decl(narrowByInstanceof.ts, 13, 40))
41+
>AA : Symbol(AA, Decl(narrowByInstanceof.ts, 2, 25))
42+
>BB : Symbol(BB, Decl(narrowByInstanceof.ts, 7, 1))
43+
44+
if (x instanceof A) {
45+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
46+
>A : Symbol(A, Decl(narrowByInstanceof.ts, 13, 26))
47+
48+
x; // A
49+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
50+
}
51+
else {
52+
x; // B | C
53+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
54+
}
55+
if (x instanceof B) {
56+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
57+
>B : Symbol(B, Decl(narrowByInstanceof.ts, 13, 33))
58+
59+
x; // B
60+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
61+
}
62+
else {
63+
x; // A | C
64+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
65+
}
66+
if (x instanceof AB) {
67+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
68+
>AB : Symbol(AB, Decl(narrowByInstanceof.ts, 13, 40))
69+
70+
x; // A | B
71+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
72+
}
73+
else {
74+
x; // A | B | C
75+
>x : Symbol(x, Decl(narrowByInstanceof.ts, 13, 13))
76+
}
77+
}
78+
79+
// Repro from #52571
80+
81+
class PersonMixin extends Function {
82+
>PersonMixin : Symbol(PersonMixin, Decl(narrowByInstanceof.ts, 32, 1))
83+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
84+
85+
public check(o: any) {
86+
>check : Symbol(PersonMixin.check, Decl(narrowByInstanceof.ts, 36, 36))
87+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 37, 17))
88+
89+
return typeof o === "object" && o !== null && o instanceof Person;
90+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 37, 17))
91+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 37, 17))
92+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 37, 17))
93+
>Person : Symbol(Person, Decl(narrowByInstanceof.ts, 42, 30))
94+
}
95+
}
96+
97+
const cls = new PersonMixin();
98+
>cls : Symbol(cls, Decl(narrowByInstanceof.ts, 42, 5))
99+
>PersonMixin : Symbol(PersonMixin, Decl(narrowByInstanceof.ts, 32, 1))
100+
101+
class Person {
102+
>Person : Symbol(Person, Decl(narrowByInstanceof.ts, 42, 30))
103+
104+
work(): void { console.log("work") }
105+
>work : Symbol(Person.work, Decl(narrowByInstanceof.ts, 44, 14))
106+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
107+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
108+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
109+
110+
sayHi(): void { console.log("Hi") }
111+
>sayHi : Symbol(Person.sayHi, Decl(narrowByInstanceof.ts, 45, 40))
112+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
113+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
114+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
115+
}
116+
117+
class Car {
118+
>Car : Symbol(Car, Decl(narrowByInstanceof.ts, 47, 1))
119+
120+
sayHi(): void { console.log("Wof Wof") }
121+
>sayHi : Symbol(Car.sayHi, Decl(narrowByInstanceof.ts, 49, 11))
122+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
123+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
124+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
125+
}
126+
127+
function test(o: Person | Car) {
128+
>test : Symbol(test, Decl(narrowByInstanceof.ts, 51, 1))
129+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 53, 14))
130+
>Person : Symbol(Person, Decl(narrowByInstanceof.ts, 42, 30))
131+
>Car : Symbol(Car, Decl(narrowByInstanceof.ts, 47, 1))
132+
133+
if (o instanceof cls) {
134+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 53, 14))
135+
>cls : Symbol(cls, Decl(narrowByInstanceof.ts, 42, 5))
136+
137+
console.log("Is Person");
138+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
139+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
140+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
141+
142+
(o as Person).work()
143+
>(o as Person).work : Symbol(Person.work, Decl(narrowByInstanceof.ts, 44, 14))
144+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 53, 14))
145+
>Person : Symbol(Person, Decl(narrowByInstanceof.ts, 42, 30))
146+
>work : Symbol(Person.work, Decl(narrowByInstanceof.ts, 44, 14))
147+
}
148+
else {
149+
console.log("Is Car")
150+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
151+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
152+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
153+
154+
o.sayHi();
155+
>o.sayHi : Symbol(sayHi, Decl(narrowByInstanceof.ts, 45, 40), Decl(narrowByInstanceof.ts, 49, 11))
156+
>o : Symbol(o, Decl(narrowByInstanceof.ts, 53, 14))
157+
>sayHi : Symbol(sayHi, Decl(narrowByInstanceof.ts, 45, 40), Decl(narrowByInstanceof.ts, 49, 11))
158+
}
159+
}
160+

0 commit comments

Comments
 (0)