Vue3+TypeScript setup返回展开对象VSCode报ts(2304)错误如何解决?
问题原因
- 注入类型不匹配
你调用inject时使用的泛型Auth0Client是@auth0/auth0-spa-js官方提供的原生客户端类型,和你通过app.provide("Auth", authPlugin)注入的自定义插件对象类型完全不符。你对外暴露的authPlugin是自己封装的、包含computed属性和工具方法的对象,不是原生Auth0Client实例,所以TS无法识别该对象上存在user属性。 - 显式返回失效的原因
你封装的authPlugin对象上不存在getUser()方法,该方法是内部原生client实例的私有方法,你对外暴露的用户信息是computed类型的user属性。直接赋值const auth_user = auth.user本身逻辑是对的,之前失效是因为注入类型错误,导致运行时拿到的对象不符合预期。
解决方案
步骤1:导出插件类型
首先在你的Auth0插件文件中,导出插件实例的类型,方便全局复用:
// 你的Auth0插件代码文件末尾新增这行导出 export type AuthPluginInstance = typeof authPlugin
步骤2:修正注入类型
在Profile.vue中注入时使用正确的类型,替换原来的Auth0Client泛型:
import { inject } from "vue"; // 替换为你的Auth0插件文件的实际路径 import { AuthPluginInstance } from "@/utils/auth0-plugin"; const auth = inject<AuthPluginInstance>("Auth")!;
步骤3:选择以下任意一种方式解决模板报错
方式1:保持原展开写法
修正类型后,...auth展开的所有属性都会被TS正确识别,模板中user的报错会自动消失,不需要修改其他代码,运行逻辑也和之前一致。
方式2:显式返回需要的属性
如果不想展开整个auth对象,可以直接显式返回属性,computed返回的ref会在setup返回时自动解包,模板中直接使用即可:
export default { name: "Profile", setup() { const auth = inject<AuthPluginInstance>("Auth")!; return { user: auth.user, isAuthenticated: auth.isAuthenticated // 其他需要在模板中使用的属性按需添加 }; }, };
方式3:使用
相关产品推荐
相关产品推荐

