定义Props 的时候 extends 了另一个组件暴露的 interface 时出错 Failed to resolve extends base type
定义Props 的时候 extends 了另一个组件暴露的 interface 时出错 Failed to resolve extends base type
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 22H2 | CLI |
示例代码:
组件 A.vue
// 从组件 A.vue 暴露出一个 interface
export interface AProps {
name: string;
}
组件 B.vue
// 从组件 A.vue 引入这个 interface 并在 extends 后将这个 interface 作为组件的 props
import { AProps } from "./A.vue";
interface BProps extends AProps {
age: number;
}
const props = defineProps<BProps>();
就这样引发了报错,在将 [@dcloudio](/user/dcloudio)
的依赖版本回退到 3.0.0-3080720230703001
的时候可以成功运行,可升级到 3.0.0-4050720250324001
(最新版)后无法运行,其他依赖、代码、均无变化。
经测试这个bug是从 3.0.0-4000620240325001
版本开始出现的。 3.0.0-3090920231225001
版本仍支持此语法
操作步骤:
- 拉取代码
git clone https://gitee.com/ljb2458/jun-uni.git
- 安装依赖
pnpm i
- 启动到任意平台(此时是正常的)
pnpm run dev:mp-weix
- 更新到最新 @dcloudio 版本
pnpm run dev:mp-weixin
- 重新启动
pnpm run dev:mp-weixin
结果是报错,即使将除了 @dcloudio 的依赖全部回退也依然报错。
预期结果:
成功编译并运行。
实际结果:
报错,无法运行。
bug描述:
从 3.0.0-3080720230703001
版本升级到 3.0.0-4050720250324001
(最新版) 后编译时报错。
[@vue/compiler-sfc] Failed to resolve extends base type. If this previously worked in 3.2, you can instruct the compiler to ignore this extend by adding /* @vue-ignore */ before it, for example: interface Props extends /* @vue-ignore */ Base {}
Note: both in 3.2 or with the ignore, the properties in the base type are treated as fallthrough attrs at runtime.
经测试这个bug是从 3.0.0-4000620240325001
版本开始出现的。 3.0.0-3090920231225001
版本仍支持此语法
这是因为我在定义Props 的时候 extends
了另一个组件暴露的 interface
而引发的报错,可这种写法在 [@dcloudio](/user/dcloudio)
3.0.0-3080720230703001
是被支持的。
不是这样的,在 git clone https://gitee.com/ljb2458/jun-uni.git 中使用了该写法,并没有报错,在仅升级 @dcloudio 依赖至 3.0.0-4000620240325001 之后的版本开始的报错,因此 3.0.0-4000620240325001 之后的版本可能有什么改动使这种原本受支持的版本失效了。
这是一个已知的TypeScript编译器限制问题。在较新版本的@dcloudio/uni-app中,Vue SFC编译器对类型扩展的处理更加严格。
解决方法有以下几种:
- 使用注释忽略该错误:
interface BProps extends /* @vue-ignore */ AProps {
age: number;
}
- 将接口定义提取到单独的.d.ts文件中:
// types/props.d.ts
export interface AProps {
name: string;
}
// B.vue
import { AProps } from "./types/props";
interface BProps extends AProps {
age: number;
}