Property does not exist on type Window in TypeScript [Fixed] | bobbyhadz (2024)

# Table of Contents

  1. Property does not exist on type Window in TypeScript
  2. Property 'X' does not exist on type 'typeof globalThis

The article shows how to solve the error by extending the Window orglobalThis interface.

# Property does not exist on type Window in TypeScript

The "Property does not exist on type 'Window & typeof globalThis'" erroroccurs when we access a property that doesn't exist on the Window interface.

To solve the error, extend the Window interface in a .d.ts file and addthe property you intend to access on the window object.

Here is an example of how the error occurs:

index.ts

Copied!

// ⛔️ Property 'example' does not exist on// type 'Window & typeof globalThis'.ts(2339)window.example = 'bobbyhadz.com';console.log(window.example);

Property does not exist on type Window in TypeScript [Fixed] | bobbyhadz (1)

In your src directory, create a types directory that contains the followingindex.d.ts file:

src/types/index.d.ts

Copied!

export {};declare global { interface Window { example: string; }}

The code for this article is available on GitHub

The code sample shows how to extend the Window interface with a property named example that has a type of string. This will be different in your case, so make sure to adjust the property names and the types.

# Turn off type checking for a specific property

If you don't know the type of the specific property and want to turn off typechecking, set it to any.

src/types/index.d.ts

Copied!

export {};declare global { interface Window { example: any; // 👈️ turn off type checking }}

The code for this article is available on GitHub

Now I'm able to set and access the example property on the window objectwithout getting the error.

index.ts

Copied!

// ✅ Works nowwindow.example = 'bobbyhadz.com';console.log(window.example);

Property does not exist on type Window in TypeScript [Fixed] | bobbyhadz (2)

# Add the types directory to your tsconfig.json file

If the error persists, try adding the path to your types directory to yourtsconfig.json file.

tsconfig.json

Copied!

{ "compilerOptions": { // ... rest "typeRoots": ["./node_modules/@types", "./src/types"] }}

We used the export {} line in our index.d.ts file to mark it as an externalmodule.

A module is a file that contains at least 1 import or export statement, sowe are required to do that to be able to augment the global scope.

Note that you will have to change the contents of the provided index.d.ts file according to your use case.

You should add the names (and types) of all of the properties you intend toaccess on the window object.

src/types/index.d.ts

Copied!

export {};declare global { interface Window { example: string; }}

The code for this article is available on GitHub

The provided file simply adds an example property with a type of string,which is most likely not what you need.

TypeScript looks for .d.ts files in the same places it looks for your regular .ts files. The location is determined by the include and exclude settings in yourtsconfig.json file.

TypeScript will merge the declared from you Windowinterface with the originalWindow interface, so when you use the window object, you will be able toaccess properties from both interfaces.

# Using an inline type assertion

You can also use an inline type assertion.

index.ts

Copied!

const result = (window as any).myProperty;console.log(result);

We used a type assertion in place to type the window object as any whichenables us to access any property on the object without getting a type error.

However, this solution is hacky and should be avoided, unless you can't getanything else to work.

# Property 'X' does not exist on type 'typeof globalThis'

The error "Property 'X' does not exist on type 'typeof globalThis" occurs whenwe try to access a property that doesn't exist on the global object.

To solve the error, extend the global object and add types for the necessaryproperties.

Here is an example of how the error occurs.

index.ts

Copied!

// ⛔️ Property 'hello' does not exist on type 'typeof globalThis'.global.hello = 'bobbyhadz.com';

Property does not exist on type Window in TypeScript [Fixed] | bobbyhadz (3)

We tried to access a property that doesn't exist on the global object and gotthe error.

# Add typings for the properties and methods you need to access on global

We have to add typings for the properties and methods we intend to access on theglobal object.

In your src directory, create a types directory that contains the followingindex.d.ts file:

src/types/index.d.ts

Copied!

/* eslint-disable no-var */declare global { var example: string; function sum(a: number, b: number): number;}export {};

We added an example property that has a type of string and a sum method.

Note that this will be different in your use case, so make sure to adjust the property names and the types.

Make sure to use the var keyword to add typings for properties you intend toset and use in other files.

You need to add the names and types of all of the properties you intend toaccess on the global object.

For example, if you don't know the type of the specific property and want toturn off type checking, set it to any.

src/types/index.d.ts

Copied!

/* eslint-disable no-var */declare global { var example: string; function sum(a: number, b: number): number;}export {};

Now, I'm able to set and access the specified property on the global objectwithout getting any errors.

index.ts

Copied!

global.example = 'hello world';global.sum = function (a: number, b: number) { return a + b;};console.log(global.example); // 👉️ "hello world"console.log(global.sum(15, 25)); // 👉️ 40

Property does not exist on type Window in TypeScript [Fixed] | bobbyhadz (4)

Note that you might still be getting an error in your terminalif you are using ts-node.

# Solve the issue with ts-node

The problem is with ts-node not recognizing localdeclaration files.

To resolve this, use the --files flag with your ts-node command, so insteadof ts-node ./src/index.ts you should run ts-node --files ./src/index.ts.

I use nodemon with ts-node and here are the contents of my nodemon.jsonfile.

nodemon.json

Copied!

{ "watch": ["src"], "ext": ".ts,.js", "ignore": [], "exec": "ts-node --files ./src/index.ts"}

After adding the --files flag (only required if using ts-node), restart yourserver and you should be good to go.

Note that this makes the sum function and the example property accessibledirectly (globally) and on the global object.

index.ts

Copied!

global.example = 'bobbyhadz.com';global.sum = function (a: number, b: number) { return a + b;};console.log(global.example); // 👉️ "bobbyhadz.com"console.log(global.sum(15, 25)); // 👉️ 40console.log(example); // 👉️ "bobbyhadz.com"console.log(sum(5, 15)); // 👉️ 20

# Add the path to your types directory to tsconfig.json

If you still get an error in your IDE, try adding the path to your typesdirectory to your tsconfig.json file.

tsconfig.json

Copied!

{ "compilerOptions": { // ... rest "typeRoots": ["./node_modules/@types", "./src/types"] }}

We used the export {} line in our index.d.ts file to mark it as an externalmodule. A module is a file that contains at least 1 import or exportstatement. We are required to do that to be able to augment the global scope.

Note that you will have to change the contents of the provided index.d.ts file according to your use case.

You should add the names (and types) of all of the properties you intend toaccess on the global object.

src/types/index.d.ts

Copied!

/* eslint-disable no-var */declare global { var example: any; // 👈️ disables type checking for property function sum(a: number, b: number): number;}export {};

The provided file simply adds an example property with a type of any and asum method, which is most likely not what you need.

TypeScript looks for .d.ts files in the same places it looks for your regular.ts files.

The location is determined by the include and exclude settings in yourtsconfig.json file.

TypeScript will merge the typings you declared on the global object with theoriginal typings, so you will be able to access properties and methods from bothdeclarations.

# Additional Resources

You can learn more about the related topics by checking out the followingtutorials:

  • Extend String.prototype and other prototypes in TypeScript
  • How to extend Array.prototype in TypeScript
  • Property does not exist on type '{}' in TypeScript
Property does not exist on type Window in TypeScript [Fixed] | bobbyhadz (2024)
Top Articles
Latest Posts
Article information

Author: Fr. Dewey Fisher

Last Updated:

Views: 5573

Rating: 4.1 / 5 (62 voted)

Reviews: 93% of readers found this page helpful

Author information

Name: Fr. Dewey Fisher

Birthday: 1993-03-26

Address: 917 Hyun Views, Rogahnmouth, KY 91013-8827

Phone: +5938540192553

Job: Administration Developer

Hobby: Embroidery, Horseback riding, Juggling, Urban exploration, Skiing, Cycling, Handball

Introduction: My name is Fr. Dewey Fisher, I am a powerful, open, faithful, combative, spotless, faithful, fair person who loves writing and wants to share my knowledge and understanding with you.