我得到了这个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 |
如果我在测试文件中导入这些函数,jest就可以正常运行。无法理解在ES5中正确使用外部函数的方法。
发布于 2019-04-01 13:49:22
有两个问题:
export
/import
,通常称为"ESM“)与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
...or (风格决定):
const sum = (a, b) => a + b
const mul = (a, b) => a * b
export { sum, mul };
对于名为exports的导入,您可以像使用import
一样使用语法,而不是使用require
import { sum, mul } from "./math";
这不是破坏,虽然看起来很相似。它缺乏破坏的几个特性(嵌套、默认值、.)。
也可以导入命名空间对象。
import * as math from "./math";
它将具有sum
和mul
属性(这就是为什么通常不导出带有JavaScript本机模块的对象;任何真正需要的对象都可以得到一个命名空间对象)。
发布于 2019-04-01 13:44:49
使用named export
:
export const sum = (a, b) => a + b
export const mul = (a, b) => a * b
或
export {sum,mul}
然后
import { sum, mul } from './math'
发布于 2019-04-01 13:43:43
替换
const { sum, mul } = require('./math')
使用
import { sum, mul } from './math'
https://stackoverflow.com/questions/55456575
复制相似问题