web-dev-qa-db-fra.com

Comment empêcher "Property '..." n'existe pas sur le type "Global" "avec jsdom et dactylographe?

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/');
15
fahrradflucht

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;
26
Steven Spungin

En plus d'autres réponses, vous pouvez aussi simplement castglobal directement sur le site d'affectation:

(global as any).myvar = myvar;
9
lleaff

J'ai résolu ce problème en faisant cela ...

export interface Global {
  document: Document;
  window: Window;
}

declare var global: Global;
6
Shawn
declare namespace NodeJS {
  export interface Global { window: any;
  }
}
3
Oleg Mikhailenko

É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
}
0
willsquire