J'essaie de convertir un projet existant pour qu'il utilise TypeScript et je rencontre des problèmes avec ma configuration de test.
J'avais un fichier d'installation pour mes tests qui configurait jsdom afin que tout mon code d'interaction DOM fonctionne pendant mes tests. En utilisant TypeScript (ts-node avec mocha), je reçois toujours des erreurs comme celle-ci:
Property 'window' does not exist on type 'Global'.
Pour éviter cela, j'ai essayé de patcher l'interface NodeJS.Global comme ceci:
declare namespace NodeJS{
interface Global {
document: Document;
window: Window;
navigator: Navigator;
}
}
Mais cela n'a rien changé.
Comment activer ces propriétés du navigateur sur la variable globale NodeJS?
Extras:
Ceci est mon mocha setup.ts
:
import { jsdom, changeURL } from 'jsdom';
const exposedProperties = ['window', 'navigator', 'document'];
global.document = jsdom('');
global.window = global.document.defaultView;
Object.keys(global.document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
exposedProperties.Push(property);
global[property] = global.document.defaultView[property];
}
});
global.navigator = {
userAgent: 'node.js',
};
changeURL(global.window, 'http://example.com/');
Placez ceci en haut de votre fichier TypeScript
const globalAny:any = global;
Ensuite, utilisez globalAny à la place.
globalAny.document = jsdom('');
globalAny.window = global.document.defaultView;
En plus d'autres réponses, vous pouvez aussi simplement castglobal
directement sur le site d'affectation:
(global as any).myvar = myvar;
J'ai résolu ce problème en faisant cela ...
export interface Global {
document: Document;
window: Window;
}
declare var global: Global;
declare namespace NodeJS {
export interface Global { window: any;
}
}
Évitez de transtyper any
, cela supprime le but des typages. Installez plutôt les définitions de type nécessaires (par exemple, yarn add --dev @types/jsdom @types/node
) et importez-les à utiliser:
import { DOMWindow, JSDOM } from 'jsdom'
interface Global extends NodeJS.Global {
window: DOMWindow,
document: Document,
navigator: {
userAgent: string
}
}
const globalNode: Global = {
window: window,
document: window.document,
navigator: {
userAgent: 'node.js',
},
...global
}