Создайте глобальную переменную в TypeScript

В JavaScript я могу просто сделать это:

 something = 'testing';

А потом в другом файле:

 if (something === 'testing')

и это будет иметь something определенное (если они были вызваны в правильном порядке).

Я не могу понять, как это сделать в TypeScript.

Это то, что я пытался.

В файле .d.ts:

interface Window { something: string; }

Тогда в моем файле main.ts:

 window.something = 'testing';

тогда в другом файле:

 if (window.something  === 'testing')

И это работает. Но я хочу иметь возможность потерять window. часть этого и просто сделай так, чтобы мой something был глобальным. Есть ли способ сделать это в TypeScript?

(Если кому-то это интересно, я действительно пытаюсь настроить ведение журнала для своего приложения. Я хочу иметь возможность вызывать log.Debug из любого файла без необходимости импорта и создания объектов.)

Ответ 1

Хорошо, так что это, вероятно, еще хуже, чем вы, но все равно...

но я тоже так делаю...

То, что вы можете сделать, чтобы сделать это в чистом TypeScript, это использовать функцию eval следующим образом:

declare var something: string;
eval("something = 'testing';")

И позже вы сможете сделать

if (something === 'testing')

Это не что иное, как хак для принудительного выполнения инструкции без отказа TypeScript от компиляции, и мы declare var для TypeScript для компиляции остальной части кода.

Ответ 2

Внутри файла определения .d.ts

type MyGlobalFunctionType = (name: string) => void

Если вы работаете в браузере, вы добавляете участников в контекст окна браузера:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

Такая же идея для NodeJS:

declare module NodeJS {
  interface Global {
    myGlobalFunction: MyGlobalFunctionType
  }
}

Теперь вы объявляете корневую переменную (которая фактически будет жить в окне или глобальном)

declare const myGlobalFunction: MyGlobalFunctionType;

Затем в регулярном файле .ts, но импортированном как побочный эффект, вы фактически реализуете его:

global/* or window */.myGlobalFunction = function (name: string) {
  console.log("Hey !", name);
};

И, наконец, используйте его в другом месте в базе кода: либо

global/* or window */.myGlobalFunction("Kevin");

myGlobalFunction("Kevin");

Ответ 3

Я нашел способ, который работает, если я использую JavaScript в сочетании с TypeScript.

logging.d.ts:

declare var log: log4javascript.Logger;

срубы декларации. JS:

log = null;

app.ts-инициализировать

import './log-declaration.js';

// Call stuff to actually setup log.  
// Similar to this:
log = functionToSetupLog();

Это помещает его в глобальную область видимости, и TypeScript знает об этом. Так что я могу использовать его во всех моих файлах.

ПРИМЕЧАНИЕ. Я думаю, что это работает только потому, что для параметра allowJs TypeScript установлено значение true.

Если кто-то опубликует чистое решение TypeScript, я приму это.

Ответ 4

im, используя только этот

import {globalVar} from "./globals";
declare let window:any;
window.globalVar = globalVar;

Ответ 5

Это будущее.

// Way 1
var abc: number
globalThis.abc = 200 // no error

// Way2
declare var age: number
globalThis.age = 18 // no error

ПРИМЕЧАНИЕ. Файл, содержащий вышеуказанные коды, не может содержать оператор import

До сих пор это способы, которые я понял, чтобы расширить глобальный объект.

Вся магия происходит от var. Замените var на let или const не будет работать.

Я попытался расширить модуль globalThis путем объявления слияния, но не удалось.

Ответ 6

Вот как я это исправил:

шаги:

  1. Объявлено глобальное пространство имен, например, для custom.d.ts, как показано ниже:

    объявить глобальный {namespace NodeJS {interface Global {Config: {}}}} экспорт по умолчанию глобальный;

  2. Сопоставьте созданный выше файл с файлом "tsconfig.json", как показано ниже:

    "typeRoots": ["src/types/custom.d.ts"]

  3. Получите созданную выше глобальную переменную в любом из файлов, как показано ниже:

    console.log(global.config)

Замечания:

  1. машинописная версия: "3.0.1".

  2. В моем случае требовалось установить глобальную переменную перед загрузкой приложения, и переменная должна иметь доступ ко всем зависимым объектам, чтобы мы могли получить требуемые свойства конфигурации.

Надеюсь это поможет!

Спасибо

Ответ 7

Как дополнение к ответу Dima V, это то, что я сделал, чтобы эта работа для меня.

//First declare the window global outside the class

declare let window: any;

//Inside the required class method

let globVarName = window.globVarName;

Ответ 8

Я потратил пару часов, чтобы найти правильный способ сделать это. В моем случае я пытаюсь определить глобальную переменную log, чтобы шаги были такими:

1) настройте свой tsconfig.json на включение определенных вами типов (папка src/types, node_modules - зависит от вас):

...other stuff...
"paths": {
  "*": ["node_modules/*", "src/types/*"]
}

2) создайте файл src/types/global.d.ts со следующим содержимым (без импорта! - это важно), не стесняйтесь изменять any в соответствии с вашими потребностями + используйте интерфейс window вместо NodeJS если вы работаете с браузером:

/**
 * IMPORTANT - do not use imports in this file!
 * It will break global definition.
 */
declare namespace NodeJS {
    export interface Global {
        log: any;
    }
}

declare var log: any;

3) теперь вы, наконец, можете использовать/внедрять log там, где это необходимо:

// in one file
global.log = someCoolLogger();
// in another file
log.info('hello world');
// or if its a variable
global.log = 'INFO'

Ответ 9

Просто напишите var something = "testing";