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"
]
}