tests/cases/compiler/inKeywordTypeguard.ts(6,11): error TS2339: Property 'b' does not exist on type 'A'. tests/cases/compiler/inKeywordTypeguard.ts(8,11): error TS2339: Property 'a' does not exist on type 'B'. tests/cases/compiler/inKeywordTypeguard.ts(14,11): error TS2339: Property 'b' does not exist on type 'A'. tests/cases/compiler/inKeywordTypeguard.ts(16,11): error TS2339: Property 'a' does not exist on type 'B'. tests/cases/compiler/inKeywordTypeguard.ts(27,11): error TS2339: Property 'b' does not exist on type 'AWithOptionalProp | BWithOptionalProp'. Property 'b' does not exist on type 'AWithOptionalProp'. tests/cases/compiler/inKeywordTypeguard.ts(42,11): error TS2339: Property 'b' does not exist on type 'AWithMethod'. tests/cases/compiler/inKeywordTypeguard.ts(49,11): error TS2339: Property 'a' does not exist on type 'never'. tests/cases/compiler/inKeywordTypeguard.ts(50,11): error TS2339: Property 'b' does not exist on type 'never'. tests/cases/compiler/inKeywordTypeguard.ts(52,11): error TS2339: Property 'a' does not exist on type 'AWithMethod | BWithMethod'. Property 'a' does not exist on type 'BWithMethod'. tests/cases/compiler/inKeywordTypeguard.ts(53,11): error TS2339: Property 'b' does not exist on type 'AWithMethod | BWithMethod'. Property 'b' does not exist on type 'AWithMethod'. tests/cases/compiler/inKeywordTypeguard.ts(62,11): error TS2339: Property 'b' does not exist on type 'A | C | D'. Property 'b' does not exist on type 'A'. tests/cases/compiler/inKeywordTypeguard.ts(64,11): error TS2339: Property 'a' does not exist on type 'B'. tests/cases/compiler/inKeywordTypeguard.ts(72,32): error TS2339: Property 'b' does not exist on type 'A'. tests/cases/compiler/inKeywordTypeguard.ts(74,32): error TS2339: Property 'a' does not exist on type 'B'. tests/cases/compiler/inKeywordTypeguard.ts(82,39): error TS2339: Property 'b' does not exist on type 'A'. tests/cases/compiler/inKeywordTypeguard.ts(84,39): error TS2339: Property 'a' does not exist on type 'B'. tests/cases/compiler/inKeywordTypeguard.ts(94,26): error TS2339: Property 'a' does not exist on type 'never'. tests/cases/compiler/inKeywordTypeguard.ts(103,13): error TS2322: Type '{ a: string; } & { b: string; }' is not assignable to type 'never'. ==== tests/cases/compiler/inKeywordTypeguard.ts (18 errors) ==== class A { a: string; } class B { b: string; } function negativeClassesTest(x: A | B) { if ("a" in x) { x.b = "1"; ~ !!! error TS2339: Property 'b' does not exist on type 'A'. } else { x.a = "1"; ~ !!! error TS2339: Property 'a' does not exist on type 'B'. } } function positiveClassesTest(x: A | B) { if ("a" in x) { x.b = "1"; ~ !!! error TS2339: Property 'b' does not exist on type 'A'. } else { x.a = "1"; ~ !!! error TS2339: Property 'a' does not exist on type 'B'. } } class AWithOptionalProp { a?: string; } class BWithOptionalProp { b?: string; } function positiveTestClassesWithOptionalProperties(x: AWithOptionalProp | BWithOptionalProp) { if ("a" in x) { x.a = "1"; } else { x.b = "1"; ~ !!! error TS2339: Property 'b' does not exist on type 'AWithOptionalProp | BWithOptionalProp'. !!! error TS2339: Property 'b' does not exist on type 'AWithOptionalProp'. } } class AWithMethod { a(): string { return ""; } } class BWithMethod { b(): string { return ""; } } function negativeTestClassesWithMembers(x: AWithMethod | BWithMethod) { if ("a" in x) { x.a(); x.b(); ~ !!! error TS2339: Property 'b' does not exist on type 'AWithMethod'. } else { } } function negativeTestClassesWithMemberMissingInBothClasses(x: AWithMethod | BWithMethod) { if ("c" in x) { x.a(); ~ !!! error TS2339: Property 'a' does not exist on type 'never'. x.b(); ~ !!! error TS2339: Property 'b' does not exist on type 'never'. } else { x.a(); ~ !!! error TS2339: Property 'a' does not exist on type 'AWithMethod | BWithMethod'. !!! error TS2339: Property 'a' does not exist on type 'BWithMethod'. x.b(); ~ !!! error TS2339: Property 'b' does not exist on type 'AWithMethod | BWithMethod'. !!! error TS2339: Property 'b' does not exist on type 'AWithMethod'. } } class C { a: string; } class D { a: string; } function negativeMultipleClassesTest(x: A | B | C | D) { if ("a" in x) { x.b = "1"; ~ !!! error TS2339: Property 'b' does not exist on type 'A | C | D'. !!! error TS2339: Property 'b' does not exist on type 'A'. } else { x.a = "1"; ~ !!! error TS2339: Property 'a' does not exist on type 'B'. } } class ClassWithUnionProp { prop: A | B } function negativePropTest(x: ClassWithUnionProp) { if ("a" in x.prop) { let y: string = x.prop.b; ~ !!! error TS2339: Property 'b' does not exist on type 'A'. } else { let z: string = x.prop.a; ~ !!! error TS2339: Property 'a' does not exist on type 'B'. } } class NegativeClassTest { protected prop: A | B; inThis() { if ("a" in this.prop) { let z: number = this.prop.b; ~ !!! error TS2339: Property 'b' does not exist on type 'A'. } else { let y: string = this.prop.a; ~ !!! error TS2339: Property 'a' does not exist on type 'B'. } } } class UnreachableCodeDetection { a: string; inThis() { if ("a" in this) { } else { let y = this.a; ~ !!! error TS2339: Property 'a' does not exist on type 'never'. } } } function positiveIntersectionTest(x: { a: string } & { b: string }) { if ("a" in x) { let s: string = x.a; } else { let n: never = x; ~ !!! error TS2322: Type '{ a: string; } & { b: string; }' is not assignable to type 'never'. } }