错误报告
当使用带有@types/node
的JS文件时,在包括类似module.exports = {}
的行之后,module
的类型从NodeModule
变为某种奇怪的东西(typeof import("/sandbox/not_working");
)。
🔎检索词
模块.导出,节点模块,导入类型
🕗版本和回归信息
- 这是我尝试的每个版本的行为,我查看了关于
4.2.3
条目的FAQ
Playground链接
CodeSandbox link with relevant code的最大值
💻代码
/// <reference types="node"/>
// INFO: This is JS
/**
* @param {NodeModule} aModule
* /
function createLogger(aModule) {}
createLogger(module); // INFO: module here is triggering the error.
// INFO: THIS LINE BREAKS IT
module.exports = {};
🙁实际行为
var module: {
"\"/sandbox/not_working\"": typeof import("/sandbox/not_working");
}
Argument of type '{ "\"/sandbox/not_working\"": typeof import("/sandbox/not_working"); }'
is not assignable to parameter of type 'NodeModule'.
Type '{ "\"/sandbox/not_working\"": typeof import("/sandbox/not_working"); }'
is missing the following properties from type 'NodeModule': require, id, filename, loaded, and 3 more.
ts(2345)
🙂预期行为
我希望module
的类型总是NodeModule
。
3条答案
按热度按时间p4rjhz4m1#
解决方法:
exports.
代替module.exports
(侵入性最小)import
/export
ECMA模块语法(根据捆绑器或运行时环境,可能会造成侵入)unknown
而不是NodeModule
作为参数类型(容易,丢失键入信息)ha5z0ras2#
如果没有
module.exports
行,该文件将被视为一个全局脚本,因此在module
标识符周围没有任何特殊行为。一旦有了
module.exports
行,文件就被认为是一个模块,并在JS上下文中获得特殊行为,试图模拟CommonJS模块行为。作为其中的一部分,module
是一种“特殊符号”,只能看到自己的导出(因此不能作为NodeModule
传递到其他地方)要在这两种情况下都能做到这一点,就必须有一些关于如何声明模块文件所具有的特殊内容的概念。到目前为止,还没有真正的需求,这将是一种侵入性的变化,所以我们必须看到更多的反馈或围绕这一点的用例,才能更多地思考实际需要什么(如果有的话)。
4dbbbstv3#
@RyanCavanaugh谢谢你的回复和解释。解决方案很简单,不管是什么解决方案,我都不会被任何东西阻止。但是
module
的行为变化对我来说绝对不是直观的。