instalar - Extender el objeto global de TypeScript en node.js
typescript npm (4)
Vi esta publicación de SO y traté esto:
Probablemente tengas algo como vendor.d.ts :
// some import
// AND/OR some export
declare module NodeJS {
interface Global {
spotConfig: any
}
}
Su archivo debe estar limpio de cualquier import o exports nivel raíz. Eso convertiría el archivo en un módulo y lo desconectaría del espacio de nombres de declaración de tipo global .
Más: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html
Tengo una aplicación node.js que adjunta información de configuración al objeto global :
global.myConfig = {
a: 1,
b: 2
}
El compilador de TypeScript no le gusta esto porque el tipo Global no tiene ningún objeto llamado myConfig :
TS2339: La propiedad ''myConfig'' no existe en el tipo ''Global''.
No quiero hacer esto
global[''myConfig''] = { ... }
¿Cómo extiendo el tipo Global para que contenga myConfig o simplemente le pido a TypeScript que se calle y confíe en mí? Prefiero el primero.
No quiero cambiar las declaraciones dentro de node.d.ts Vi esta publicación de SO y traté esto:
declare module NodeJS {
interface Global {
myConfig: any
}
}
como una forma de extender la interfaz Global existente, pero no parece tener ningún efecto.
Lo único que me funciona es esto:
// lib / my.d.ts
import Global = NodeJS.Global;
export interface CDTGlobal extends Global {
cdtProjectRoot: string
}
y luego usarlo en otros archivos como tal
import {CDTGlobal} from "../lib/my.d.ts";
declare const global: CDTGlobal;
const cwd = global.cdtProjectRoot; // works
Para evitar que Typescript reclame algo como esto:
TS2339: La propiedad ''myConfig'' no existe en el tipo ''Global''.
Sugiero definir tipos personalizados. Lo hago bajo el archivo src/types/custom.d.ts en mi proyecto:
declare global {
namespace NodeJS {
interface Global {
myConfig: {
a: number;
b: number;
}
}
}
}
Luego me tsconfig.json que tsconfig.json considere en el archivo tsconfig.json :
{
...
"files": [
...
"src/types/custom.d.ts"
]
}
Ahora estás seguro de usar tu propiedad personalizada:
console.log(global.myConfig.a);
Poner el siguiente archivo en el directorio raíz de nuestro proyecto funcionó.
global.d.ts
declare namespace NodeJS {
export interface Global {
myConfig: any
}
}
Estamos utilizando "@types/node": "^7.0.18" y TypeScript Version 2.3.4 . Nuestro archivo tsconfig.json se ve así:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}