En JavaScript, puedo hacer esto:
something = 'testing';
Y luego en otro archivo:
if (something === 'testing')
y se habrá something
definido (siempre que se hayan llamado en el orden correcto).
Parece que no puedo averiguar cómo hacer eso en TypeScript.
Esto es lo que he probado.
En un archivo .d.ts:
interface Window { something: string; }
Luego, en mi archivo main.ts:
window.something = 'testing';
luego en otro archivo:
if (window.something === 'testing')
Y esto funciona. Pero quiero poder perder una window.
parte y something
ser global. ¿Hay alguna forma de hacer eso en TypeScript?
(En caso de que alguien esté interesado, realmente estoy tratando de configurar mi registro para mi aplicación. Quiero poder llamar log.Debug
desde cualquier archivo sin tener que importar y crear objetos).
fuente
.d.ts
archivo de definición.export declare const SERVER = "10.1.1.26";
eval
Se desaconseja mucho el uso , por eso sugiero usar esta solución stackoverflow.com/a/56984504/5506278Dentro de un
.d.ts
archivo de definicióntype MyGlobalFunctionType = (name: string) => void
Si trabaja en el navegador, agrega miembros al contexto de la ventana del navegador:
interface Window { myGlobalFunction: MyGlobalFunctionType }
Misma idea para NodeJS:
declare module NodeJS { interface Global { myGlobalFunction: MyGlobalFunctionType } }
Ahora declara la variable raíz (que realmente vivirá en la ventana o global)
declare const myGlobalFunction: MyGlobalFunctionType;
Luego, en un
.ts
archivo normal , pero importado como efecto secundario, realmente lo implementa:global/* or window */.myGlobalFunction = function (name: string) { console.log("Hey !", name); };
Y finalmente úselo en otra parte del código base, con:
global/* or window */.myGlobalFunction("Kevin"); myGlobalFunction("Kevin");
fuente
.ts
archivos, pero cuando lo usowindow.myGlobalFunction
en mis.tsx
archivos, no es así. ¿Qué más necesito cambiar?global Este es el futuro.
Primero, los archivos TypeScript tienen dos tipos de
scopes
alcance global
Si su archivo no tiene ninguna línea
import
oexport
, este archivo se ejecutará en el alcance global de que todas las declaraciones en él sean visibles fuera de este archivo.Entonces crearíamos variables globales como esta:
// xx.d.ts declare var age: number // or // xx.ts // with or without declare keyword var age: number // other.ts globalThis.age = 18 // no error
alcance del módulo
Si su archivo tiene alguna línea
import
oexport
, este archivo se ejecutará dentro de su propio alcance que necesitamos extender globalmente mediante la combinación de declaraciones .// xx[.d].ts declare global { var age: number; } // other.ts globalThis.age = 18 // no error
fuente
var
es necesario. Pero puede simplemente declarar variable sin inicialización// @ts-ignore
encima de laglobalThis
línea para el linter.Así es como lo he solucionado:
Pasos:
declare global { namespace NodeJS { interface Global { Config: {} } } } export default global;
"typeRoots": ["src/types/custom.d.ts" ]
console.log(global.config)
Nota:
versión mecanografiada: "3.0.1".
En mi caso, el requisito era establecer la variable global antes de iniciar la aplicación y la variable debería acceder a través de los objetos dependientes para que podamos obtener las propiedades de configuración necesarias.
¡Espero que esto ayude!
Gracias
fuente
Encontré una forma que funciona si uso JavaScript combinado con TypeScript.
logging.d.ts:
declare var log: log4javascript.Logger;
declaración de registro. js :
log = null;
initalize-app.ts
import './log-declaration.js'; // Call stuff to actually setup log. // Similar to this: log = functionToSetupLog();
Esto lo coloca en el ámbito global y TypeScript lo sabe. Entonces puedo usarlo en todos mis archivos.
NOTA: Creo que esto solo funciona porque tengo la
allowJs
opción TypeScript configurada como verdadera.Si alguien publica una solución pura de TypeScript, la aceptaré.
fuente
declare var log: any;
Entonces no necesita tener el archivo d.ts o el archivo js. También puede reemplazar cualquiera con un tipo real o una definición de interfaz.estoy usando solo esto
import {globalVar} from "./globals"; declare let window:any; window.globalVar = globalVar;
fuente
Pasé un par de horas para encontrar la manera adecuada de hacerlo. En mi caso, estoy tratando de definir la variable "log" global, por lo que los pasos fueron:
1) configure su
tsconfig.json
para incluir sus tipos definidos (src/types
carpeta, node_modules - depende de usted):...other stuff... "paths": { "*": ["node_modules/*", "src/types/*"] }
2) cree un archivo
src/types/global.d.ts
con el siguiente contenido (¡ sin importaciones! - esto es importante), siéntase libre de cambiarany
para que coincida con sus necesidades + use lawindow
interfaz en lugar deNodeJS
si está trabajando con el navegador:/** * IMPORTANT - do not use imports in this file! * It will break global definition. */ declare namespace NodeJS { export interface Global { log: any; } } declare var log: any;
3) ahora finalmente puede usar / implementar
log
donde sea necesario:// in one file global.log = someCoolLogger(); // in another file log.info('hello world'); // or if its a variable global.log = 'INFO'
fuente
paths
detsconfig.json
? Los documentos no lo mencionan.Global
escribe con mayúscula en las definiciones, pero no en el uso real?Global
con capital: así es como se nombra la declaración de interfaz "global" en el espacio de nombres de nodejs.Necesitaba hacer lodash global para usar un archivo .js existente que no podía cambiar, solo requerir.
Descubrí que esto funcionó:
import * as lodash from 'lodash'; (global as any)._ = lodash;
fuente
Como complemento a la respuesta de Dima V, esto es lo que hice para que esto funcionara para mí.
// First declare the window global outside the class
declare let window: any;
// Inside the required class method
let globVarName = window.globVarName;
fuente
Esto funciona para mí, como se describe en este hilo :
declare let something: string; something = 'foo';
fuente