TypeScript 在JS文件中,在文件中使用modul.exports会将模块的类型从NodeModule更改为typeofimport(“...”)

klr1opcd  于 2022-10-29  发布在  TypeScript
关注(0)|答案(3)|浏览(156)

错误报告

当使用带有@types/node的JS文件时,在包括类似module.exports = {}的行之后,module的类型从NodeModule变为某种奇怪的东西(typeof import("/sandbox/not_working");)。

🔎检索词

模块.导出,节点模块,导入类型

🕗版本和回归信息

  • 这是我尝试的每个版本的行为,我查看了关于4.2.3条目的FAQ

Playground链接

CodeSandbox link with relevant code的最大值

💻代码

  1. /// <reference types="node"/>
  2. // INFO: This is JS
  3. /**
  4. * @param {NodeModule} aModule
  5. * /
  6. function createLogger(aModule) {}
  7. createLogger(module); // INFO: module here is triggering the error.
  8. // INFO: THIS LINE BREAKS IT
  9. module.exports = {};

🙁实际行为

  1. var module: {
  2. "\"/sandbox/not_working\"": typeof import("/sandbox/not_working");
  3. }
  4. Argument of type '{ "\"/sandbox/not_working\"": typeof import("/sandbox/not_working"); }'
  5. is not assignable to parameter of type 'NodeModule'.
  6. Type '{ "\"/sandbox/not_working\"": typeof import("/sandbox/not_working"); }'
  7. is missing the following properties from type 'NodeModule': require, id, filename, loaded, and 3 more.
  8. ts(2345)

🙂预期行为

我希望module的类型总是NodeModule

p4rjhz4m

p4rjhz4m1#

解决方法:

  • 使用exports.代替module.exports(侵入性最小)
  • 使用import/export ECMA模块语法(根据捆绑器或运行时环境,可能会造成侵入)
  • 使用unknown而不是NodeModule作为参数类型(容易,丢失键入信息)
ha5z0ras

ha5z0ras2#

如果没有module.exports行,该文件将被视为一个全局脚本,因此在module标识符周围没有任何特殊行为。
一旦有了module.exports行,文件就被认为是一个模块,并在JS上下文中获得特殊行为,试图模拟CommonJS模块行为。作为其中的一部分,module是一种“特殊符号”,只能看到自己的导出(因此不能作为NodeModule传递到其他地方)
要在这两种情况下都能做到这一点,就必须有一些关于如何声明模块文件所具有的特殊内容的概念。到目前为止,还没有真正的需求,这将是一种侵入性的变化,所以我们必须看到更多的反馈或围绕这一点的用例,才能更多地思考实际需要什么(如果有的话)。

4dbbbstv

4dbbbstv3#

@RyanCavanaugh谢谢你的回复和解释。解决方案很简单,不管是什么解决方案,我都不会被任何东西阻止。但是module的行为变化对我来说绝对不是直观的。

相关问题