Как создать глобальную переменную на TypeScript?

Я пытаюсь создать переменную, которую можно будет использовать в любой части проекта.

При использовании:

global.test = 5;

Возникает ошибка:

Свойство "test" не существует в типе "Global".

Я знаю что использовать глобальные - это зло, но мне нужно это.


Ответы (2 шт):

Автор решения: qwabra

package.json

{
  "dependencies": {
    "@types/node": "^13.13.4",
    "typescript": "^3.8.3"
  }
}

q.ts

namespace NodeJS {
    export interface Global {
        readonly qwaConst: string
        qwaVar: string
    }
}

global.qwaVar = ""
//@ts-ignore
global.qwaConst = ""

index.ts

import './q' // не забываем первым делом импортировать файл с инициализацией глобальных переменных, желательно констант
// import '...' затем уже остальные


global.qwaConst
global.qwaVar

@types/node

node_modules/@types/node/globals.d.ts -> namespace NodeJS -> interface Global

расширить можно так

namespace NodeJS {
    export interface Global {
        readonly qwaConst: string
        qwaVar: string
    }
}

ещё немного примеров

globalThis

→ Ссылка
Автор решения: Жора Змейкин

В последних версиях создание глобальной переменной изменилось

Многие ответы устарели. Если вы используете Node.js не забудьте установить @types/node последней версии. И так, вот как теперь нужно делать:

export {};

declare global {
    var qwaVar: string;
}

И всё, теперь можете обращаться к переменной qwaVar через global или window (в зависимости от того какое у вас окружение):

console.log(global.qwaVar)

Не забудьте только в начале файла с declare global поставить export {}, это нужно для того чтобы ваш файл считался за модуль (или что-то вроде того). Эту декларацию можно положить в отдельный файл, как я это и сделал:

g.ts

/* eslint-disable no-var */
/* eslint-disable no-unused-vars */
export {};

declare global {
    var nodeVersion: string;
}

index.ts

global.nodeVersion = process.versions.node;
console.log(global.nodeVersion);
→ Ссылка