【问题标题】:Augment imported typescript module interfaces增强导入的 typescript 模块接口
【发布时间】:2017-04-04 11:51:32
【问题描述】:

我正在尝试为可以在电子应用程序中提供类型安全性的事件指定一些覆盖。

对于我的类型:

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;
  }
}

我不知道如何做到这一点,以便我可以在个别事件上获得类型安全。

谢谢

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    扩充WebContents 接口的正确语法是:

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

    在此之后,您将看到send(...) 上的重载选项:

    更新

    您可以将其放在您的声明文件中(例如 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;
            }
        }
    }
    

    【讨论】:

    • 啊,谢谢。不幸的是,我希望的副作用是,如果我没有正确的 arg 值,错误将不起作用,我不确定是否可能。
    • 我已经阅读了很多文档,但不太清楚在我的代码中放置这样的声明的位置。我可以将文件放在哪里以及如何配置我的编译选项以查看它?
    • 原始event.sender.send(...) 的问题在于它接受any 作为第二个参数的类型,因此与您的扩充语句不同的所有其他类型都可以使用。关于模块扩充,您可以为此创建特定文件(例如 custom-typings.d.ts)。你有这方面的错误吗?
    • 我应该把那个文件放在哪里才能让它正确加载?本身没有错误日志,只是根本没有加载。
    • 好的,我将创建一个小型 github 存储库,向您展示如何设置它。
    猜你喜欢
    • 2018-04-05
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2018-07-25
    • 2012-11-14
    相关资源
    最近更新 更多