开发者问题收集

无法将 remote.require() 与 TypeScript 一起使用

2018-02-27
1785

我正在用 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 会抛出一堆错误,尽管程序运行正常。


需要注意的事项:

  1. 我的 tsconfig.json 的内容是:

    {
    "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "./",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "alwaysStrict": true,
    },
    "exclude": [
    "node_modules"
    ]
    }
    
  2. 在编译后的 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 一起使用?

1个回答

当你在 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')
unional
2018-02-28