我得到了这个math.js:
const sum = (a, b) => a + b
const mul = (a, b) => a * b
export default { sum, mul }
然后在math.test.js中:
const { sum, mul } = require('./math')
test('Adding 1 + 1 equals 2', () => {
expect(sum(1, 1)).toBe(2)
})
test('Multiplying 1 * 1 equals 1', () => {
expect(mul(1, 1)).toBe(1)
})
我从玩笑中得到了这个错误:
? Adding 1 + 1 equals 2
TypeError: sum is not a function
5 | })
6 | test('Adding 1 + 1 equals 2', () => {
> 7 | expect(sum(1, 1)).toBe(2)
8 | })
9 |
如果我将这些功能导入测试文件,则说明运行良好。 无法理解在ES5中采用外部功能的正确方法。
答案 0 :(得分:3)
有两个问题:
此行可能不执行您认为的操作:
export default { sum, mul }
您正在混合本机模块语法(export
/ import
,通常称为 E CMA S cript的“ ESM” M 个指令)(具有CommonJS语法(require
)。使用import
导入ESM语法。
export default { sum, mul }
导出默认的导出对象,该对象是具有属性sum
和mul
的对象(对于ESM来说这很奇怪)。如果确实要这样做,那很好,但这通常不是最佳实践。您不能在导入时对对象进行解构,但是可以在导入对象后对其进行解构:
// BUT YOU PROBABLY DON'T WANT TO DO THIS, KEEP READING
import math from "./math"; // Imports that default export
cosnt {sum, mul} = math; // Destructures it into constants
但是,通常您会在使用时使用命名出口:
export const sum = (a, b) => a + b
export const mul = (a, b) => a * b
...或一次全部(样式决定):
const sum = (a, b) => a + b
const mul = (a, b) => a * b
export { sum, mul };
要导入,请使用与import
而不是require
相同的语法:
import { sum, mul } from "./math";
虽然看起来很相似,但这并不是破坏性的。它缺乏解构的几个功能(嵌套,默认值等)。
或者,您也可以导入命名空间对象:
import * as math from "./math";
上面将具有sum
和mul
属性(这就是为什么通常不导出带有JavaScript本机模块的对象;任何真正想要的对象都可以获取名称空间对象的原因)。 / p>
答案 1 :(得分:2)
使用named export
:
export const sum = (a, b) => a + b
export const mul = (a, b) => a * b
或
export {sum,mul}
然后
import { sum, mul } from './math'
答案 2 :(得分:0)
替换
const { sum, mul } = require('./math')
使用
import { sum, mul } from './math'
答案 3 :(得分:0)
您可以按原样保留函数声明,并将导出更改为export { add, mul }
并如上所述,将您的require
语句更改为import
。