无法将 remote.require() 与 TypeScript 一起使用
我正在用 TypeScript 开发一个 Electron 应用程序,遇到了一个令人沮丧的问题。
我试图用以下代码从渲染器进程运行一个模块:
import { remote } from 'electron'
const myModule = remote.require('./my-module')
我可以将
remote.require
与我的模块一起使用的唯一方法是将
module.exports = myModule
添加到
my-module.ts
文件。
// my-module.ts
export class myModule { ... }
module.exports = myModule
添加
module.exports = myModule
行后,每当我使用标准 TypeScript 导入 myModule 时都会导致错误。
对于例如
// main.ts
import { myModule } from './my-module'
// Error here
要修复此错误,我可以简单地用
const myModule = require('./my-module')
替换 import 语句。但是,当我将 import 语句替换为上面的语句时,我的 TypeScript 无法识别
myModule
及其所有成员。智能感知没有显示
myModule
的任何内容,并且 TypeScript 会抛出一堆错误,尽管程序运行正常。
需要注意的事项:
-
我的 tsconfig.json 的内容是:
{ "compilerOptions": { "target": "es5", "module": "commonjs", "moduleResolution": "node", "outDir": "./", "emitDecoratorMetadata": true, "experimentalDecorators": true, "alwaysStrict": true, }, "exclude": [ "node_modules" ] }
-
在编译后的 JavaScript 代码中,与 TypeScript 导入语句一起使用时,会产生类似以下内容:
var my_module_1 = require("./my-module"); my_module_1.myModule.foo('bar');
这给了我一个错误
TypeError: Cannot read property 'sayHi' of undefined
。JavaScript 应该看起来像这样才能工作:
var my_module_1 = require("./my-module"); my_module_1.foo('bar');
如何将
remote.require()
与 TypeScript 一起使用?
当你在 ESM 中实现代码并将其导入 commonjs 时(这就是
remote.require()
所做的),你将获得模块命名空间对象:
// myModule.ts
export function foo() { ... }
// and to access the default export:
export default const boo = 'boo'
// consumer.js
const myModule = require('./myModule')
myModule = { foo() { ... }, default: 'boo' }
因此,要使用
myModule
类,你需要执行以下操作:
const myModule = remote.require('./myModule')
const obj = new myModule.myModule()
const boo = myModule.default
更新:
remote.require()
是一个动态调用,因此 TypeScript 无法检测
myModule
的类型并将其设置为
any
。
你可以执行以下操作来恢复类型:
import * as MyModule from './myModule'
const myModule: typeof MyModule = remote.require('./myModule')