import/export 的外部类型在 jest 单元测试 (vue2) 中失败
import/export of external types failing in jest unit tests (vue2)
我正在尝试创建一个包来导出我在多个项目中使用的某些类型、枚举、常量和接口。
所以我创建了一个 main.ts
并将所有导出放在那里,在 package.json 中指定它:"main": "main.ts"
.
我的一个出口需要一些 mapbox-gl
类型。显然,我不希望我的包包含 mapbox-gl
类型。所以我做了以下事情:
"peerDependencies": {
"mapbox-gl": "^1.13.0"
},
"devDependencies": {
"@types/mapbox-gl": "^1.13.0",
}
在main.ts
里面,我做:
import mapboxgl from "mapbox-gl";
export interface DataSourceOptions {
shouldLoad?: boolean;
name: string;
map: mapboxgl.Map;
layer: mapboxgl.Layer;
}
我发布了我的包,并将其导入到我的项目中,并且它按预期工作。
直到我尝试使用这个包测试任何组件。
Jest 抛出以下错误:
D:\path\to\project\node_modules\some-custom-package\main.ts:1
({"Object.":function(module,exports,require,__dirname,__filename,global,jest){import mapboxgl from "mapbox-gl";
SyntaxError: Cannot use import statement outside a module
我试图通过在 jest.config.js
的 transformIgnorePatterns
中指定我的包来解决这个问题:
transformIgnorePatterns: [
"<rootDir>/node_modules/(?!(@mapbox/mapbox-gl-draw" +
"|some-custom-package" +
")/)",
],
但是,我仍然看到同样的错误。
我也尝试过使用 tsc
和 rollup-plugin-typescript2
插件将我的包与 rollup
捆绑在一起,因为我知道在 rollup
中我可以使用 [=26] =] 来声明 mapbox-gl
。由于某些未知原因,tsc
和 rollup-plugin-typescript2
似乎都没有声明我的接口,它们只声明了 const
s、type
s 和 enum
s(possibly related).
我知道这看起来像是将多个问题合二为一,但我只是在寻找解决方案。
- 要么解决 jest 在导入我的包时遇到的问题(同样,我所拥有的在实际应用程序中运行良好 - 它仅在测试中失败)
- 或者找到一种方法来保留接口,同时将我的导出与汇总捆绑在一起并将
mapbox-gl
声明为外部
我看到的一个可能的解决方法是通过使我从中使用的类型动态化来绕过我的包中的 mapboxgl 导入:
export interface DataSourceOptions<M,L> {
shouldLoad?: boolean;
name: string;
map: M;
layer: L;
}
并且,在我的项目中:options: DataSourceOptions<mapboxgl.Map, mapboxgl.Layer>
,但老实说,我不太喜欢这个解决方案。它规避了问题,并没有解决问题。
我能够通过设置修复它:
"type": "module"
在模块的 package.json
中,并将其添加到使用它的项目的 jest.config.js
中的 transformIgnorePatterns
,如上所示。
我正在尝试创建一个包来导出我在多个项目中使用的某些类型、枚举、常量和接口。
所以我创建了一个 main.ts
并将所有导出放在那里,在 package.json 中指定它:"main": "main.ts"
.
我的一个出口需要一些 mapbox-gl
类型。显然,我不希望我的包包含 mapbox-gl
类型。所以我做了以下事情:
"peerDependencies": {
"mapbox-gl": "^1.13.0"
},
"devDependencies": {
"@types/mapbox-gl": "^1.13.0",
}
在main.ts
里面,我做:
import mapboxgl from "mapbox-gl";
export interface DataSourceOptions {
shouldLoad?: boolean;
name: string;
map: mapboxgl.Map;
layer: mapboxgl.Layer;
}
我发布了我的包,并将其导入到我的项目中,并且它按预期工作。 直到我尝试使用这个包测试任何组件。
Jest 抛出以下错误:
D:\path\to\project\node_modules\some-custom-package\main.ts:1 ({"Object.":function(module,exports,require,__dirname,__filename,global,jest){import mapboxgl from "mapbox-gl"; SyntaxError: Cannot use import statement outside a module
我试图通过在 jest.config.js
的 transformIgnorePatterns
中指定我的包来解决这个问题:
transformIgnorePatterns: [
"<rootDir>/node_modules/(?!(@mapbox/mapbox-gl-draw" +
"|some-custom-package" +
")/)",
],
但是,我仍然看到同样的错误。
我也尝试过使用 tsc
和 rollup-plugin-typescript2
插件将我的包与 rollup
捆绑在一起,因为我知道在 rollup
中我可以使用 [=26] =] 来声明 mapbox-gl
。由于某些未知原因,tsc
和 rollup-plugin-typescript2
似乎都没有声明我的接口,它们只声明了 const
s、type
s 和 enum
s(possibly related).
我知道这看起来像是将多个问题合二为一,但我只是在寻找解决方案。
- 要么解决 jest 在导入我的包时遇到的问题(同样,我所拥有的在实际应用程序中运行良好 - 它仅在测试中失败)
- 或者找到一种方法来保留接口,同时将我的导出与汇总捆绑在一起并将
mapbox-gl
声明为外部
我看到的一个可能的解决方法是通过使我从中使用的类型动态化来绕过我的包中的 mapboxgl 导入:
export interface DataSourceOptions<M,L> {
shouldLoad?: boolean;
name: string;
map: M;
layer: L;
}
并且,在我的项目中:options: DataSourceOptions<mapboxgl.Map, mapboxgl.Layer>
,但老实说,我不太喜欢这个解决方案。它规避了问题,并没有解决问题。
我能够通过设置修复它:
"type": "module"
在模块的 package.json
中,并将其添加到使用它的项目的 jest.config.js
中的 transformIgnorePatterns
,如上所示。