我正在使用 typescript 3.7.5、tslib 1.10.0 和 vue 2.6.14 开发一个项目。最近我们想升级 typescript 和 tslib 版本,拥有 typescript 4.x 和 tslib 2.x。我将它们升级到 typescript 4.5.2、tslib 2.3.1 并在源代码覆盖中替换了我的 js 文件后,我从前端组件中收到一个错误:
Uncaught TypeError: Cannot read properties of undefined (reading 'split')
这当然没有说什么,所以我开始挖掘。我发现这个问题的原因是在升级 typescript 和 tslib 版本后,Vue 不再包含默认属性。
我的组件像这样导入和导出 Vue:
import Vue, { Component as VueComponent, ComponentOptions, CreateElement, RenderContext, VNode } from "vue";
export default Vue;
export {
Vue,
// ... and some other components
};
前端组件像这样使用它:
import { Vue } from "my-component-package";
export const Sth = new Vue();
在编译的前端代码中,产生不同结果的地方是这个方法:
function _interopDefaultLegacy(e) {
return e && "object" == typeof e && "default" in e ? e : {
default: e
}
}
因此:
- 我没有从 Vue 导入的默认属性。
- 我的对象看起来像这样:
{ default: { someKey: SomeValue }}
而不是:{ someKey: SomeValue, default: { /* some props here */} }
前端组件设置了这些编译标志:
{
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"sourceMap": true,
"declaration": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"outDir": "./build",
"allowJs": false,
"resolveJsonModule": true,
"esModuleInterop": true,
}
我的组件有这些:
{
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"sourceMap": true,
"declaration": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowJs": false,
}
目标是 es5,模块类型都是 CommonJS。
我尝试使用这些标志:
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
双方,但并没有改变任何东西。
我想寻求帮助以了解 vue 的默认导出/导入问题 - 升级 typescript 和 tslib 如何影响此模块的导出/导入方式。当然还有帮助找出可能的解决方案。
先感谢您。