web-dev-qa-db-fra.com

Extension de l'objet global TypeScript dans node.js

J'ai une application node.js qui associe des informations de configuration à l'objet global:

global.myConfig = {
    a: 1,
    b: 2
}

Le compilateur TypeScript n'aime pas cela parce que le type Global n'a pas d'objet nommé myConfig:

TS2339: La propriété 'myConfig' n'existe pas sur le type 'Global'.

Je ne veux pas faire ça:

global['myConfig'] = { ... }

Comment puis-je étendre le type Global afin qu'il contienne myConfig ou simplement dire à TypeScript de se taire et de me faire confiance? Je préférerais le premier.

Je ne veux pas changer les déclarations à l'intérieur de node.d.ts. J'ai vu ceci SO post et essayé ceci:

declare module NodeJS  {
    interface Global {
        myConfig: any
    }
}

comme moyen d'étendre l'interface Global existante, mais cela ne semble pas avoir d'effet.

44
d512

J'ai vu ceci SO post et essayé ceci:

Vous avez probablement quelque chose comme vendor.d.ts:

// some import 
// AND/OR some export

declare module NodeJS  {
    interface Global {
        spotConfig: any
    }
}

Votre fichier doit être propre de tout niveau racine import ou exports. Cela transformerait le fichier en un module et le déconnecterait de l'espace de noms de la déclaration de type globale .

Plus: https://basarat.gitbooks.io/TypeScript/content/docs/project/modules.html

55
basarat

Pour éviter le typeScript, réclamez quelque chose comme ceci:

TS2339: La propriété 'myConfig' n'existe pas sur le type 'Global'.

Je suggère de définir des types personnalisés. Je le fais sous src/types/custom.d.ts fichier dans mon projet:

declare global {
  namespace NodeJS {
    interface Global {
        myConfig: {
          a: number;
          b: number;
        }
    }
  }
}

Ensuite, je m'assure que ceux-ci sont pris en compte par TypeScript dans tsconfig.json fichier:

{
  ...
  "files": [
    ...
    "src/types/custom.d.ts"
  ]
}

Vous pouvez maintenant utiliser votre propriété personnalisée en toute sécurité:

console.log(global.myConfig.a);
31
Nik Sumeiko

Mettre le fichier suivant dans le répertoire racine de notre projet a fonctionné.

global.d.ts

declare namespace NodeJS {
  export interface Global {
    myConfig: any
  }
}

Nous utilisons "@types/node": "^7.0.18" et TypeScript Version 2.3.4. Notre fichier tsconfig.json ressemble à ceci:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6"  
    },
    "exclude": [
        "node_modules"
    ]
}
12
Shaun Luttin

La seule chose qui fonctionne pour moi est la suivante:

// lib/my.d.ts

import Global = NodeJS.Global;
export interface CDTGlobal extends Global {
  cdtProjectRoot: string
}

puis en l'utilisant dans d'autres fichiers comme si

import {CDTGlobal} from "../lib/my.d.ts";
declare const global: CDTGlobal;

const cwd = global.cdtProjectRoot; // works
7
Alexander Mills

Copiez ma réponse de autre message :

globalThis est l'avenir.

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

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