tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(24,19): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(32,19): error TS18048: 'this' is possibly 'undefined'. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(46,23): error TS2331: 'this' cannot be referenced in a module or namespace body. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(46,23): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(52,23): error TS2331: 'this' cannot be referenced in a module or namespace body. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(52,23): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(57,19): error TS7041: The containing arrow function captures the global value of 'this'. tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts(57,24): error TS7017: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature. ==== tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts (8 errors) ==== class Test { data = {}; constructor() { var copy: typeof this.data = {}; } } class Test1 { data = { foo: '' }; ['this'] = ''; constructor() { var copy: typeof this.data = { foo: '' }; var foo: typeof this.data.foo = ''; var self: typeof this = this; self.data; var str: typeof this.this = ''; } } function Test2() { let x: typeof this.no = 1; ~~~~ !!! error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. } function Test3(this: { no: number }) { let x: typeof this.no = 1; } function Test4(this: { no: number } | undefined) { let x: typeof this.no = 1; ~~~~ !!! error TS18048: 'this' is possibly 'undefined'. } class Test5 { no = 1; f = () => { // should not capture this. let x: typeof this.no = 1; } } namespace Test6 { export let f = () => { let x: typeof this.no = 1; ~~~~ !!! error TS2331: 'this' cannot be referenced in a module or namespace body. ~~~~ !!! error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. } } module Test7 { export let f = () => { let x: typeof this.no = 1; ~~~~ !!! error TS2331: 'this' cannot be referenced in a module or namespace body. ~~~~ !!! error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. } } const Test8 = () => { let x: typeof this.no = 1; ~~~~ !!! error TS7041: The containing arrow function captures the global value of 'this'. ~~ !!! error TS7017: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature. } class Test9 { no = 0; this = 0; f() { if (this instanceof Test9D1) { const d1: typeof this = this; d1.f1(); } if (this instanceof Test9D2) { const d2: typeof this = this; d2.f2(); } } g() { if (this.no === 1) { const no: typeof this.no = this.no; } if (this.this === 1) { const no: typeof this.this = this.this; } } } class Test9D1 { f1() {} } class Test9D2 { f2() {} } class Test10 { a?: { b?: string } foo() { let a: typeof this.a = undefined as any; if (this.a) { let a: typeof this.a = undefined as any; // should narrow to { b?: string } let b: typeof this.a.b = undefined as any; if (this.a.b) { let b: typeof this.a.b = undefined as any; // should narrow to string } } } } class Test11 { this?: { x?: string }; foo() { const o = this; let bar: typeof o.this = {}; if (o.this && o.this.x) { let y: string = o.this.x; // should narrow to string } } } class Tests12 { test1() { // OK type Test = typeof this; } test2() { // OK for (;;) {} type Test = typeof this; } test3() { // expected no compile errors for (const dummy in []) {} type Test = typeof this; } test4() { // expected no compile errors for (const dummy of []) {} type Test = typeof this; } }