[请教]TypeScript如何给EventEmitter重新声明类型?
问题描述
目前我在使用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'.
}