无法识别 ES5 导出函数
ES5 exported function not recognized
我知道了 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 中获取外部函数的正确方法。
替换
const { sum, mul } = require('./math')
和
import { sum, mul } from './math'
使用 named export
:
export const sum = (a, b) => a + b
export const mul = (a, b) => a * b
或
export {sum,mul}
然后
import { sum, mul } from './math'
有两个问题:
这一行可能与您认为的不一样:
export default { sum, mul }
您正在混合本机模块语法 (export
/import
,通常为 ECMA 调用 "ESM" S脚本 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 命名导出,您将像以前一样使用语法,但使用 import
,而不是 require
:
import { sum, mul } from "./math";
这不是解构,尽管看起来很相似。它缺少解构的几个特性(嵌套、默认值、...)。
或者您可以导入一个 命名空间对象:
import * as math from "./math";
上面会有 sum
和 mul
属性(这就是为什么您通常不使用 JavaScript 本机模块导出对象;任何真正想要的东西都可以得到命名空间对象)。
您可以按原样保留函数声明并将导出更改为 export { add, mul }
如上所述,将您的 require
语句更改为 import
.
我知道了 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 中获取外部函数的正确方法。
替换
const { sum, mul } = require('./math')
和
import { sum, mul } from './math'
使用 named export
:
export const sum = (a, b) => a + b
export const mul = (a, b) => a * b
或
export {sum,mul}
然后
import { sum, mul } from './math'
有两个问题:
这一行可能与您认为的不一样:
export default { sum, mul }
您正在混合本机模块语法 (
export
/import
,通常为 ECMA 调用 "ESM" S脚本 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 命名导出,您将像以前一样使用语法,但使用 import
,而不是 require
:
import { sum, mul } from "./math";
这不是解构,尽管看起来很相似。它缺少解构的几个特性(嵌套、默认值、...)。
或者您可以导入一个 命名空间对象:
import * as math from "./math";
上面会有 sum
和 mul
属性(这就是为什么您通常不使用 JavaScript 本机模块导出对象;任何真正想要的东西都可以得到命名空间对象)。
您可以按原样保留函数声明并将导出更改为 export { add, mul }
如上所述,将您的 require
语句更改为 import
.