2017-04-03 51 views
0

我想指定一些覆蓋事件,這些事件會給我一個電子應用程序的類型安全。擴充進口打字稿模塊接口

對於我的類型:

export type SectionName = 'webview' 
    | 'index' 
    | 'settings' 

export interface ShowSection { 
    key: SectionName, 
} 

我要以擴大此碼:

import { 
    ipcMain, 
} from 'electron' 

ipcMain.on('rendered', (event) => { 
    const sender = event.sender 

    event.sender.send('show-section', { 
    key: 'index', 
    }) 
}) 

發件人是Electron.WebContents類型被定義here

我試圖增加像這個:

declare namespace Electron { 
    interface WebContents extends NodeJS.EventEmitter { 
    send(channel: 'show-section', arg: ShowSection): void; 
    } 
} 

我不確定如何做到這一點,以便我可以在單個事件中獲得類型安全。

感謝

回答

1

正確的語法,以增加WebContents接口:

declare global { 
    namespace Electron { 
     interface WebContents extends NodeJS.EventEmitter { 
      send(channel: 'show-section', arg: ShowSection): void; 
     } 
    } 
} 

在此之後,你會看到超載選項在send(...)

enter image description here

UPDATE

你可以把它放在你的聲明文件(例如custom-typings.d.ts):

export interface ShowSection { 
    key: SectionName 
} 

export type SectionName = 
    'webview' 
    | 'index' 
    | 'settings' 

declare global { 
    namespace Electron { 
     interface WebContents extends NodeJS.EventEmitter { 
      send(channel: 'show-section', arg: ShowSection): void; 
     } 
    } 
} 
+0

啊謝謝,工作。不幸的是,我期待的副作用,如果我沒有正確的價值arg的錯誤不起作用,我不確定如果可能。 – Tal

+0

我已經閱讀了一些文檔,但無法弄清楚在我的代碼中放置這樣的聲明的位置。我可以在哪裏放置該文件,以及如何配置我的編譯選項以查看它? – Tal

+1

原始'event.sender.send(...)'的問題在於它接受'any'作爲第二個參數的類型,因此每個其他類型的擴充語句都不同。關於模塊擴充,您可以爲此創建特定的文件(例如custom-typings.d.ts)。你有這個錯誤嗎? – Diullei