Vyhledávání na webu

node.js - Rozšíření pro globální rozsah mohou být přímo vnořena pouze v externích modulech nebo deklaracích ambientních modulů (2669)


Chtěl bych uložit svou konfiguraci NodeJS do globálního rozsahu.

Snažil jsem se následovat toto => Rozšiřování globálního objektu TypeScript v node.js a další řešení na stackoverflow,

Vytvořil jsem soubor s názvem global.d.ts, kde mám následující kód

declare global {
    namespace NodeJS {
      interface Global {
          config: MyConfigType
      }
    }
  }

Rozšíření pro globální rozsah mohou být přímo vnořena pouze v externích modulech nebo deklaracích ambientních modulů.ts(2669)

ale dělat tohle funguje dobře =>

declare module NodeJS  {
    interface Global {
        config: MyConfigType
    }
}

Problém je, že potřebuji importovat soubor MyConfigType, abych mohl typizovat konfiguraci, ale druhá možnost to neumožňuje.

Odpověď č. 1

Můžete označit, že soubor je modul, takto:

export {};

declare global {
    namespace NodeJS {
        interface Global {
            config: MyConfigType
        }
    }
}

Odpověď č. 2

Nebo pokud se pokoušíte přidat globální typ v kontextu prohlížeče:

export {};

declare global {
  interface Window {
    ENV: any;
  }
}

Odpověď č. 3

Pokud váš .d.ts se spouští jako „skript“ (nemá žádné import/export příkazy), nebudete muset vůbec používat declare global a můžete ho jednoduše odstranit. „Skript“ se již spouští v globálním kontextu.

(mimochodem: toto je důvod, proč přidání export {} funguje, přemění to skript na modul a vaše deklarace v .d.ts už nejsou výchozě globální)

S příkladem, který upravuje console:

Před:

declare global {
  interface Console {
    log2: (...args: any[])=>void;
  }
}

Po :

// This will be global!
interface Console {
  log2: (...args: any[])=>void;
}

Díky @okcoker a https://stackoverflow.com/a/42257742/2759427 za vysvětlení kontextů .d.ts

Související články