//// [typeGuardOfFormIsType.ts] class C1 { p1: string; } class C2 { p2: number; } class D1 extends C1 { p3: number; } var str: string; var num: number; var strOrNum: string | number; function isC1(x: any): x is C1 { return true; } function isC2(x: any): x is C2 { return true; } function isD1(x: any): x is D1 { return true; } var c1Orc2: C1 | C2; str = isC1(c1Orc2) && c1Orc2.p1; // C1 num = isC2(c1Orc2) && c1Orc2.p2; // C2 str = isD1(c1Orc2) && c1Orc2.p1; // D1 num = isD1(c1Orc2) && c1Orc2.p3; // D1 var c2Ord1: C2 | D1; num = isC2(c2Ord1) && c2Ord1.p2; // C2 num = isD1(c2Ord1) && c2Ord1.p3; // D1 str = isD1(c2Ord1) && c2Ord1.p1; // D1 var r2: C2 | D1 = isC1(c2Ord1) && c2Ord1; // C2 | D1 //// [typeGuardOfFormIsType.js] var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var C1 = (function () { function C1() { } return C1; })(); var C2 = (function () { function C2() { } return C2; })(); var D1 = (function (_super) { __extends(D1, _super); function D1() { _super.apply(this, arguments); } return D1; })(C1); var str; var num; var strOrNum; function isC1(x) { return true; } function isC2(x) { return true; } function isD1(x) { return true; } var c1Orc2; str = isC1(c1Orc2) && c1Orc2.p1; // C1 num = isC2(c1Orc2) && c1Orc2.p2; // C2 str = isD1(c1Orc2) && c1Orc2.p1; // D1 num = isD1(c1Orc2) && c1Orc2.p3; // D1 var c2Ord1; num = isC2(c2Ord1) && c2Ord1.p2; // C2 num = isD1(c2Ord1) && c2Ord1.p3; // D1 str = isD1(c2Ord1) && c2Ord1.p1; // D1 var r2 = isC1(c2Ord1) && c2Ord1; // C2 | D1