69 lines
1.3 KiB
TypeScript
69 lines
1.3 KiB
TypeScript
// Repro from #7271
|
|
|
|
class C1 { item: string }
|
|
class C2 { item: string[] }
|
|
class C3 { item: string }
|
|
|
|
function foo1(x: C1 | C2 | C3): string {
|
|
if (x instanceof C1) {
|
|
return x.item;
|
|
}
|
|
else if (x instanceof C2) {
|
|
return x.item[0];
|
|
}
|
|
else if (x instanceof C3) {
|
|
return x.item;
|
|
}
|
|
return "error";
|
|
}
|
|
|
|
function isC1(c: C1 | C2 | C3): c is C1 { return c instanceof C1 }
|
|
function isC2(c: C1 | C2 | C3): c is C2 { return c instanceof C2 }
|
|
function isC3(c: C1 | C2 | C3): c is C3 { return c instanceof C3 }
|
|
|
|
function foo2(x: C1 | C2 | C3): string {
|
|
if (isC1(x)) {
|
|
return x.item;
|
|
}
|
|
else if (isC2(x)) {
|
|
return x.item[0];
|
|
}
|
|
else if (isC3(x)) {
|
|
return x.item;
|
|
}
|
|
return "error";
|
|
}
|
|
|
|
// More tests
|
|
|
|
class A { a: string }
|
|
class A1 extends A { }
|
|
class A2 { a: string }
|
|
class B extends A { b: string }
|
|
|
|
function goo(x: A) {
|
|
if (x instanceof A) {
|
|
x; // A
|
|
}
|
|
else {
|
|
x; // never
|
|
}
|
|
if (x instanceof A1) {
|
|
x; // A1
|
|
}
|
|
else {
|
|
x; // A
|
|
}
|
|
if (x instanceof A2) {
|
|
x; // A2
|
|
}
|
|
else {
|
|
x; // A
|
|
}
|
|
if (x instanceof B) {
|
|
x; // B
|
|
}
|
|
else {
|
|
x; // A
|
|
}
|
|
}
|