1. ホーム
  2. typescript

[解決済み] jsdomとtypescriptで「プロパティ '...' がタイプ 'Global' に存在しない」を防ぐには?

2023-05-13 09:59:38

質問内容

既存のプロジェクトをTypescriptを使用するように変換しようとしていますが、私のテストセットアップではうまくいきません。

私は、テスト用に jsdom をセットアップする設定ファイルを持っており、テスト中に DOM と相互作用するすべてのコードが動作するようにしています。Typescript (ts-node with mocha) を使用すると、常にこのようなエラーが発生します。

Property 'window' does not exist on type 'Global'.

これを防ぐために、NodeJS.Globalのインターフェイスにこのようなパッチを当ててみました。

declare namespace NodeJS{
  interface Global {
    document: Document;
    window: Window;
    navigator: Navigator;
  }
}

しかし、これでは何も変わりませんでした。

NodeJSグローバル変数でこれらのブラウザプロパティを有効にするにはどうしたらよいでしょうか。

エキストラです。

これは私のモカ 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/');

どのように解決するのですか?

エラーを回避するためのオリジナル回答

typescriptファイルの先頭に次のように記述します。

const globalAny:any = global;

それなら、代わりにglobalAnyを使えばいい。

globalAny.document = jsdom('');
globalAny.window = global.document.defaultView;

安全性を確保するための回答を更新しました。

型の安全性を確保したい場合は、既存の NodeJS.Global の型定義です。

グローバルスコープの中に定義を入れる必要がある declare global {...}

タイプスクリプトに留意してください global スコープは、NodeJSのインターフェースと同じではありません Global またはノード global property っていう global またはタイプ Global ...

declare global {
  namespace NodeJS {
    interface Global {
       document: Document;
       window: Window;
       navigator: Navigator;
    } 
  }
}