Расширение объекта TypeScript Global в node.js
У меня есть приложение node.js, которое прикрепляет некоторую конфигурационную информацию к global
объекту:
global.myConfig = {
a: 1,
b: 2
}
Компилятору TypeScript это не нравится, потому что Global
тип не имеет объекта с именем myConfig
:
TS2339: Свойство 'myConfig' не существует в типе 'Global'.
Я не хочу этого делать:
global['myConfig'] = { ... }
Как я могу либо расширить Global
тип, чтобы содержать myConfig
либо просто сказать, что TypeScript myConfig
и доверяет мне? Я бы предпочел первый.
Я не хочу изменять объявления внутри node.d.ts
Я видел это сообщение qaru.site/info/4596046/... и пробовал это:
declare module NodeJS {
interface Global {
myConfig: any
}
}
как способ расширить существующий Global
интерфейс, но он, похоже, не имеет никакого эффекта.
Ответы
Ответ 1
Я видел это сообщение SO и пробовал это:
Вероятно, у вас есть что-то вроде vendor.d.ts
:
// some import
// AND/OR some export
declare module NodeJS {
interface Global {
spotConfig: any
}
}
Ваш файл должен быть чистым от любого import
или exports
корневого уровня. Это превратит файл в модуль и отключит его от глобального пространства имен объявлений типа.
Подробнее: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html
Ответ 2
Чтобы избежать написания скрипта, выполните следующие действия:
TS2339: Свойство 'myConfig' не существует в типе 'Global'.
Я предлагаю определить пользовательские типы. Я делаю это в файле src/types/custom.d.ts
в моем проекте:
declare global {
namespace NodeJS {
interface Global {
myConfig: {
a: number;
b: number;
}
}
}
}
Тогда я гарантирую, что они рассмотрены в tsconfig.json
файле tsconfig.json
:
{
...
"files": [
...
"src/types/custom.d.ts"
]
}
Теперь вы можете использовать свое настраиваемое свойство:
console.log(global.myConfig.a);
Ответ 3
Работает следующий файл в нашем корневом каталоге проекта.
global.d.ts
declare namespace NodeJS {
export interface Global {
myConfig: any
}
}
Мы используем "@types/node": "^7.0.18"
и TypeScript Version 2.3.4
. Наш файл tsconfig.json выглядит так:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}
Ответ 4
Единственное, что работает для меня, это:
// lib/my.d.ts
import Global = NodeJS.Global;
export interface CDTGlobal extends Global {
cdtProjectRoot: string
}
а затем использовать его в других файлах, как так
import {CDTGlobal} from "../lib/my.d.ts";
declare const global: CDTGlobal;
const cwd = global.cdtProjectRoot; // works
Ответ 5
Скопируйте мой ответ из другого поста:
Это будущее.
// Way 1
var abc: number
globalThis.abc = 200 // no error
// Way2
declare var age: number
globalThis.age = 18 // no error