TypeScript/tests/cases/conformance/es2019/globalThisBlockscopedProperties.ts

18 lines
545 B
TypeScript
Raw Normal View History

Forbid accessing block-scoped variables on globalThis (#30510) * Forbid accessing const & let on globalThis It's just an error; you still get the type of the property. * Disallow access of blockscoped vars on globalThis Also change Array, Function, String, et al from `const` to `var` so that they remain accessible via `globalThis.String`. * Update baselines after lib.d.ts change Note especially the change in redefineArray, which is now allowed as long as you provide a type that is assignable to ArrayConstructor. * Remove blockscoped vars from typeof globalThis Unlike forbidding them, this removes the properties entirely. Unfortunately, this means that accessing these properties is only an error with noImplicitAny, and that error is quite confusing. Let's discuss our options. I see 3: 1. Forbid access of block-scoped vars as properties (in all flag settings), but leave them on the type. Simple to implement. 2. Remove block-scoped vars from the globalThis type. Has the bad error/flag behaviour described above, but simple to implement. 3. Remove block-scoped vars from the globalThis type. Also, forbid accessing them by executing another resolveName lookup for failed property accesses on globalThisSymbol. If the second lookup returns a blockscoped var, issue an error instead of falling back to the index signature. This seems too complex to me. * Update baselines * Better error for block-scoped usage on globalThis So that value-space references have as clear an error as type-space references. * Update fourslash tests * Fix semi-colon lint * Don't copy so much when filtering blockscoped vars
2019-03-25 22:07:48 +01:00
// @noImplicitAny: true
var x = 1
const y = 2
let z = 3
globalThis.x // ok
globalThis.y // should error, no property 'y'
globalThis.z // should error, no property 'z'
globalThis['x'] // ok
globalThis['y'] // should error, no property 'y'
globalThis['z'] // should error, no property 'z'
globalThis.Float64Array // ok
globalThis.Infinity // ok
declare let test1: (typeof globalThis)['x'] // ok
declare let test2: (typeof globalThis)['y'] // error
declare let test3: (typeof globalThis)['z'] // error
declare let themAll: keyof typeof globalThis