Расширение объекта 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