Em JavaScript, posso apenas fazer isso:
something = 'testing';
E então em outro arquivo:
if (something === 'testing')
e terá que something
ser definido (desde que tenham sido chamados na ordem correta).
Não consigo descobrir como fazer isso no TypeScript.
Isso é o que eu tentei.
Em um arquivo .d.ts:
interface Window { something: string; }
Então, em meu arquivo main.ts:
window.something = 'testing';
então em outro arquivo:
if (window.something === 'testing')
E isso funciona. Mas eu quero ser capaz de perder window.
parte disso e apenas something
ser global. Existe uma maneira de fazer isso no TypeScript?
(Caso alguém esteja interessado, estou realmente tentando configurar meu registro para meu aplicativo. Quero poder chamar log.Debug
de qualquer arquivo sem ter que importar e criar objetos.)
typescript
Vaccano
fonte
fonte
Respostas:
Ok, então isso é provavelmente ainda mais feio do que o que você fez, mas de qualquer maneira ...
mas eu faço o mesmo então ...
O que você pode fazer para fazer isso em puro TypeScript é usar a
eval
função da seguinte forma:declare var something: string; eval("something = 'testing';")
E mais tarde você poderá fazer
if (something === 'testing')
Isso nada mais é do que um hack para forçar a execução da instrução sem que o TypeScript se recuse a compilar e nós,
declare var
para o TypeScript, compilar o resto do código.fonte
.d.ts
arquivo de definição.export declare const SERVER = "10.1.1.26";
eval
é altamente desencorajado, por isso sugiro usar esta solução stackoverflow.com/a/56984504/5506278Dentro de um
.d.ts
arquivo de definiçãotype MyGlobalFunctionType = (name: string) => void
Se você trabalha no navegador, adiciona membros ao contexto da janela do navegador:
interface Window { myGlobalFunction: MyGlobalFunctionType }
Mesma ideia para NodeJS:
declare module NodeJS { interface Global { myGlobalFunction: MyGlobalFunctionType } }
Agora você declara a variável raiz (que na verdade viverá na janela ou global)
declare const myGlobalFunction: MyGlobalFunctionType;
Então, em um
.ts
arquivo normal , mas importado como efeito colateral, você realmente o implementa:global/* or window */.myGlobalFunction = function (name: string) { console.log("Hey !", name); };
E, finalmente, use-o em outro lugar na base de código, com:
global/* or window */.myGlobalFunction("Kevin"); myGlobalFunction("Kevin");
fonte
.ts
arquivos, mas quando usowindow.myGlobalFunction
em meus.tsx
arquivos, não funciona. O que mais eu preciso mudar ?!globalThis é o futuro.
Primeiro, os arquivos TypeScript têm dois tipos de
scopes
Âmbito global
Se o arquivo não tem qualquer
import
ouexport
linha , este arquivo seria executado no escopo global que todos declaração em que são visíveis fora deste arquivo.Portanto, criaríamos variáveis globais 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
escopo do módulo
Se o seu arquivo tiver qualquer linha
import
ouexport
, este arquivo será executado dentro de seu próprio escopo, que precisamos estender globalmente por fusão de declaração .// xx[.d].ts declare global { var age: number; } // other.ts globalThis.age = 18 // no error
fonte
var
é necessário. Mas você pode apenas declarar a variável sem inicialização// @ts-ignore
acima daglobalThis
linha para o linter.É assim que eu consertei:
Passos:
declare global { namespace NodeJS { interface Global { Config: {} } } } export default global;
"typeRoots": ["src/types/custom.d.ts" ]
console.log(global.config)
Nota:
versão datilografada: "3.0.1".
No meu caso, o requisito era definir a variável global antes de inicializar o aplicativo e a variável deve acessar todos os objetos dependentes para que possamos obter as propriedades de configuração necessárias.
Espero que isto ajude!
Obrigado
fonte
Descobri uma maneira que funciona se usar JavaScript combinado com TypeScript.
logging.d.ts:
declare var log: log4javascript.Logger;
declaração de log. js :
log = null;
initalize-app.ts
import './log-declaration.js'; // Call stuff to actually setup log. // Similar to this: log = functionToSetupLog();
Isso o coloca no escopo global e o TypeScript sabe disso. Posso usar em todos os meus arquivos.
NOTA: Acho que isso só funciona porque tenho a
allowJs
opção TypeScript definida como true.Se alguém postar uma solução pura do TypeScript, vou aceitar isso.
fonte
declare var log: any;
Então você não precisa ter o arquivo d.ts ou o arquivo js. Você pode substituir qualquer um por um tipo real ou uma definição de interface também.estou usando apenas isso
import {globalVar} from "./globals"; declare let window:any; window.globalVar = globalVar;
fonte
Passei algumas horas para descobrir a maneira correta de fazer isso. No meu caso, estou tentando definir a variável "log" global para que as etapas sejam:
1) configure seu
tsconfig.json
para incluir seus tipos definidos (src/types
pasta, node_modules - você decide):...other stuff... "paths": { "*": ["node_modules/*", "src/types/*"] }
2) crie o arquivo
src/types/global.d.ts
com o seguinte conteúdo ( sem importações! - isso é importante), fique à vontade para mudarany
para atender às suas necessidades + use awindow
interface em vez deNodeJS
se estiver trabalhando com o 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) agora você pode finalmente usar / implementar
log
onde for necessário:// in one file global.log = someCoolLogger(); // in another file log.info('hello world'); // or if its a variable global.log = 'INFO'
fonte
paths
dentrotsconfig.json
? Os documentos não mencionam isso.Global
capitalizado nas definições, mas não no uso real?Global
com capital - é assim que a declaração de interface "global" é nomeada no namespace nodejs.Eu precisava tornar o lodash global para usar um arquivo .js existente que não podia alterar, apenas exigir.
Eu descobri que isso funcionou:
import * as lodash from 'lodash'; (global as any)._ = lodash;
fonte
Como um complemento para a resposta de Dima V, isso é o que eu fiz para fazer isso funcionar para mim.
// First declare the window global outside the class
declare let window: any;
// Inside the required class method
let globVarName = window.globVarName;
fonte
Isso está funcionando para mim, conforme descrito neste tópico :
declare let something: string; something = 'foo';
fonte
Estou usando este:
interface Window { globalthing: any; } declare var globalthing: any;
fonte