2016-11-22 17 views
6

我嘗試將現有項目轉換爲使用Typescript,並且在測試設置中遇到問題。如何防止使用jsdom和typecript在'Global'類型中不存在'Property'...''?

我有一個設置文件,用於設置jsdom的測試,以便我所有的DOM交互代碼在我的測試過程中都能正常工作。使用打字稿(TS-節點與摩卡),我總是得到象這樣的錯誤:

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/'); 
+0

不能確定這是正確的答案,而是通過類似的疼痛在經歷,事實證明,內部文件你擴展NodeJS.Global接口必須全部小寫,否則類型將忽略它。而且,它不能在頂部有任何導入或導出語句 - 否則它將被視爲模塊而不是類型文件。 – Izhaki

回答

6

將這個在您的打字稿文件的頂部

const globalAny:any = global; 

然後使用globalAny代替。

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

我長時間ban着頭,然後,你救了我。謝謝 –

2
declare namespace NodeJS { 
    export interface Global { window: any; 
    } 
} 
+8

僅有代碼的答案對教育SO讀者幾乎沒有什麼作用。請編輯您的答案以包含一些解釋。您的答案位於審覈隊列中,因爲它已被標記爲低質量。 – mickmackusa

4

我做這個固定這個問題...

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

declare var global: Global; 
相關問題