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.
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
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);
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"
]
}
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
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