Создайте глобальную переменную в 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
Вот как я это исправил:
шаги:
-
Объявлено глобальное пространство имен, например, для custom.d.ts, как показано ниже:
объявить глобальный {namespace NodeJS {interface Global {Config: {}}}} экспорт по умолчанию глобальный;
-
Сопоставьте созданный выше файл с файлом "tsconfig.json", как показано ниже:
"typeRoots": ["src/types/custom.d.ts"]
-
Получите созданную выше глобальную переменную в любом из файлов, как показано ниже:
console.log(global.config)
Замечания:
-
машинописная версия: "3.0.1".
-
В моем случае требовалось установить глобальную переменную перед загрузкой приложения, и переменная должна иметь доступ ко всем зависимым объектам, чтобы мы могли получить требуемые свойства конфигурации.
Надеюсь это поможет!
Спасибо
Ответ 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";