当前位置: 首页 > 知识库问答 >
问题:

node.js - 无法重新声明块范围变量“addToArray”?

胡永逸
2023-05-05

我有1个文件,对它添加了一个测试文件:

test06.ts
test06.spec.ts

test06.ts

function addToArray(arr, ...args) {
  arr.push(...args)
}

module.exports = addToArray 

当我在test06.spec.ts中引用此函数的时候报错:
image.png

共有1个答案

范高刚
2023-05-05

TS 里用 CommonJS 有很多坑,既然你都已经用 TS 了,不如直接上 ESM 就好。


如果你非要不信邪的话,就是想用 CommonJS,那倒是也有解。

方案一

要么你在 tsconfig.json 里配置上:

{
    "compilerOptions": {
        "esModuleInterop": true // 这里要设置为 true,其他配置项略
    }
}

同时在导出的模块结尾加一句:

export {};

方案二

要么就用 TS 专门为适配 CommonJS 设计出来的语法:

// 导出时 module.exports = addToArray; 改成
export = addToArray;

// 导入时 let addToArray = require('./test06'); 改成
import addToArray = require('./test06');

P.S. 方案一其实还有另一个隐形的坑,先不展开了。

 类似资料:
  • 问题内容: 以下方法不起作用,因为内部块声明的变量与外部块中的变量同名。显然,变量属于声明它们的方法或类,而不属于声明它们的块,因此,我无法编写一个简短的临时临时块进行调试,而恰好将外部作用域中的变量压入阴影只是片刻: 我使用过的几乎每种块范围语言都支持此功能,包括我在学校为解释器和编译器编写的琐碎小语言。Perl可以做到这一点,Scheme甚至C都可以做到。甚至PL / SQL也支持这一点! J

  • 问题内容: 这将编译 这不会 我希望两者都能编译(也许这是C的工作方式?)。是什么原因导致无法在外部块中以相同的名称声明一个块中的变量? 问题答案: 简短的答案是:因为这是JLS§6.4中定义Java语言的方式。 您可能从其他语言中使用过,因此允许使用所谓的可变阴影。但是,Java语言的发明者认为这是一个笨拙的功能,他们不希望使用其语言: 此限制有助于检测其他一些非常模糊的错误。 但是,正如作者在

  • 问题内容: 如何在简短的变量声明中从其他块中重新声明变量? 关于此问题有很长的话题,但现在我很感兴趣如何解决此问题。 问题答案: 简短的变量声明的Go规范很明确: 短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。 因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。 这是一个如何通过在内部块中声明局部变量()并将其()分配给在外部块

  • 问题内容: ja块变量还是局部变量?我看到j的作用域只是直到for循环结束 问题答案: 局部变量在方法,构造函数或块中声明。 由此可见, 所有块变量都是局部变量。 按照块的定义 块是平衡括号之间的一组零个或多个语句,可以在允许单个语句的任何地方使用。 所以 无论在块内声明什么变量,范围都限于该块。 因此范围仅限于该块内部。那是循环。

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实