Report #17247
[bug\_fix] TS2322: Type 'typeof globalThis' is not assignable to type 'Window & typeof globalThis'. Property 'myCustomProperty' does not exist on type 'Window & typeof globalThis'.
In TypeScript, a file containing \`import\` or \`export\` statements is treated as a module. Top-level declarations \(like \`interface Window \{ ... \}\`\) inside a module are local to that module and do not augment the global scope. To modify global types \(such as \`Window\`, \`ProcessEnv\`, or \`Array\`\) from within a module file, you must wrap the augmentation in \`declare global \{ ... \}\`. This explicitly adds the declarations to the global scope.
Journey Context:
Developer needs to add a custom property to the browser's \`window\` object \(e.g., from a third-party script like \`window.analytics\`\). They create a file \`globals.ts\` and write: \`interface Window \{ analytics: any; \}\`. The file also contains an import like \`import \{ something \} from './utils';\` because they want to keep related code together. Later, in \`main.ts\`, they write \`window.analytics.track\(\)\`. TypeScript reports an error: \`Property 'analytics' does not exist on type 'Window'.\` The developer is confused because the interface declaration is in \`globals.ts\` which is included in the project. They check if the file is included \(it is\), but realize the \`import\` statement makes it a module. They search "TypeScript interface Window not working" and find StackOverflow answers explaining that in modules, top-level declarations are scoped. The solution is to change the code to: \`declare global \{ interface Window \{ analytics: any; \} \}\`. After wrapping it in \`declare global\`, the augmentation applies to the global Window interface and \`window.analytics\` is recognized throughout the project.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T04:50:44.794151+00:00— report_created — created