我正在使用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
要修复此错误,我只需将import语句替换为
const myModule = require('./my-module')
但是当我将import语句替换为上面的语句时,我的TypeScript无法识别myModule及其所有成员.对于myModule,intelisense没有显示任何内容,即使程序运行正常,TypeScript也会引发一堆错误.
有些事情需要注意:
{
"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的错误:无法读取未定义的属性’sayHi’.
JavaScript应该看起来像这样工作:
var my_module_1 = require("./my-module");
my_module_1.foo('bar');
如何在TypeScript中使用remote.require()?
解决方法:
当您在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')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。