tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(12,10): error TS2339: Property 'bar' does not exist on type 'A'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(33,5): error TS2322: Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(34,10): error TS2339: Property 'bar' does not exist on type 'B'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(65,10): error TS2339: Property 'bar1' does not exist on type 'C1 | C2'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(66,10): error TS2339: Property 'bar2' does not exist on type 'C1 | C2'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(85,10): error TS2339: Property 'bar' does not exist on type 'D'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(111,10): error TS2339: Property 'bar1' does not exist on type 'E1 | E2'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(112,10): error TS2339: Property 'bar2' does not exist on type 'E1 | E2'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(134,11): error TS2339: Property 'foo' does not exist on type 'string | F'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(135,11): error TS2339: Property 'bar' does not exist on type 'string | F'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(160,11): error TS2339: Property 'foo2' does not exist on type 'G1'. tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(182,11): error TS2339: Property 'bar' does not exist on type 'H'. ==== tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts (12 errors) ==== interface AConstructor { new (): A; } interface A { foo: string; } declare var A: AConstructor; var obj1: A | string; if (obj1 instanceof A) { // narrowed to A. obj1.foo; obj1.bar; ~~~ !!! error TS2339: Property 'bar' does not exist on type 'A'. } var obj2: any; if (obj2 instanceof A) { // can't narrow type from 'any' obj2.foo; obj2.bar; } // a construct signature with generics interface BConstructor { new (): B; } interface B { foo: T; } declare var B: BConstructor; var obj3: B | string; if (obj3 instanceof B) { // narrowed to B. obj3.foo = 1; obj3.foo = "str"; ~~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. obj3.bar = "str"; ~~~ !!! error TS2339: Property 'bar' does not exist on type 'B'. } var obj4: any; if (obj4 instanceof B) { // can't narrow type from 'any' obj4.foo = "str"; obj4.foo = 1; obj4.bar = "str"; } // has multiple construct signature interface CConstructor { new (value: string): C1; new (value: number): C2; } interface C1 { foo: string; c: string; bar1: number; } interface C2 { foo: string; c: string; bar2: number; } declare var C: CConstructor; var obj5: C1 | A; if (obj5 instanceof C) { // narrowed to C1|C2. obj5.foo; obj5.c; obj5.bar1; ~~~~ !!! error TS2339: Property 'bar1' does not exist on type 'C1 | C2'. obj5.bar2; ~~~~ !!! error TS2339: Property 'bar2' does not exist on type 'C1 | C2'. } var obj6: any; if (obj6 instanceof C) { // can't narrow type from 'any' obj6.foo; obj6.bar1; obj6.bar2; } // with object type literal interface D { foo: string; } declare var D: { new (): D; }; var obj7: D | string; if (obj7 instanceof D) { // narrowed to D. obj7.foo; obj7.bar; ~~~ !!! error TS2339: Property 'bar' does not exist on type 'D'. } var obj8: any; if (obj8 instanceof D) { // can't narrow type from 'any' obj8.foo; obj8.bar; } // a construct signature that returns a union type interface EConstructor { new (): E1 | E2; } interface E1 { foo: string; bar1: number; } interface E2 { foo: string; bar2: number; } declare var E: EConstructor; var obj9: E1 | A; if (obj9 instanceof E) { // narrowed to E1 | E2 obj9.foo; obj9.bar1; ~~~~ !!! error TS2339: Property 'bar1' does not exist on type 'E1 | E2'. obj9.bar2; ~~~~ !!! error TS2339: Property 'bar2' does not exist on type 'E1 | E2'. } var obj10: any; if (obj10 instanceof E) { // can't narrow type from 'any' obj10.foo; obj10.bar1; obj10.bar2; } // a construct signature that returns any interface FConstructor { new (): any; } interface F { foo: string; bar: number; } declare var F: FConstructor; var obj11: F | string; if (obj11 instanceof F) { // can't type narrowing, construct signature returns any. obj11.foo; ~~~ !!! error TS2339: Property 'foo' does not exist on type 'string | F'. obj11.bar; ~~~ !!! error TS2339: Property 'bar' does not exist on type 'string | F'. } var obj12: any; if (obj12 instanceof F) { // can't narrow type from 'any' obj12.foo; obj12.bar; } // a type with a prototype, it overrides the construct signature interface GConstructor { prototype: G1; // high priority new (): G2; // low priority } interface G1 { foo1: number; } interface G2 { foo2: boolean; } declare var G: GConstructor; var obj13: G1 | G2; if (obj13 instanceof G) { // narrowed to G1. G1 is return type of prototype property. obj13.foo1; obj13.foo2; ~~~~ !!! error TS2339: Property 'foo2' does not exist on type 'G1'. } var obj14: any; if (obj14 instanceof G) { // can't narrow type from 'any' obj14.foo1; obj14.foo2; } // a type with a prototype that has any type interface HConstructor { prototype: any; // high priority, but any type is ignored. interface has implicit `prototype: any`. new (): H; // low priority } interface H { foo: number; } declare var H: HConstructor; var obj15: H | string; if (obj15 instanceof H) { // narrowed to H. obj15.foo; obj15.bar; ~~~ !!! error TS2339: Property 'bar' does not exist on type 'H'. } var obj16: any; if (obj16 instanceof H) { // can't narrow type from 'any' obj16.foo1; obj16.foo2; }