[请教]TypeScript如何给EventEmitter重新声明类型?
发布于 7 年前 作者 dawanraoming 5634 次浏览 来自 问答

问题描述

目前我在使用Electron框架开发桌面应用,尝试使用Typescript 在调用ipc模块时,希望对他的参数进行限定(定义),但不知道该如何使用Typescript进行限定

期望效果

将其Listener参数限定为指定的字符串,类似type Str = 'time' | 'date' | 'length'的效果

尝试过程

尝试以下方式进行重新声明,均无效果

import {ipcMain} from 'electron';

// 接口定义,IpcMain大写开头
interface IpcMain {
  on(channel: 'abc' | 'bbc', listener: Function): this;
}
// 接口定义,ipcMain小写开头
interface ipcMain {
  on(channel: 'abc' | 'bbc', listener: Function): this;
}
// 模块声明
declare module 'electron' {
  interface IpcMain  {
    on(channel: 'abc' | 'bbc', listener: Function): this;
  }
}


// 实际代码,希望控制第一个参数的类型限定为指定字符串
ipcMain.on('message', (event: Electron.Event, arg:any) => {
      console.log(arg);
    });

感谢各位的阅读与查看🙏

5 回复

TypeScript有个叫重载的功能


interface ipcMain {
  on(channel: 'abc', listener: Function): this;
  on(channel: 'bbc', listener: Function): this;
}

@lzghzr 是的,我尝试使用声明合并,重新声明了ipcMain的接口(我提供的代码中第7行开始),和你的方法相似,但并没有实际效果

如果模块本身没有提供定义,直接用any,不要自己去定义,因为那没多大意义还会为将来埋坑

declare module 'electron' {
  interface IpcMain {
    on(channel: 'abc', listener: Function): this;
    on(channel: 'bbc', listener: Function): this;
  }
}

这个应该对应你的第三种方法,我试了一下是有效的

Typescript v2.7.1

electron v1.8.2

@lzghzr 上方第三种方法,我尝试并没有发生效果,IDE与TSC编译器均没有对我进行警告,请问是否方便将你的代码分享一下呢?

同时我进行了另外了尝试,但却是没有效果的,因为electron.d.ts内已经对ipcMain使用const定义,我再定义(如下方的代码)就会抛出错误

declare module 'electron' {
  interface IpcMain {
    on(channel: 'abc' | 'bbc', listener: Function): this;
  }

  const ipcMain: IpcMain;
  //Error:(11, 9) TS2451: Cannot redeclare block-scoped variable 'ipcMain'.
}

回到顶部