TypeScript+Vuex项目报Property 'authorities' does not exist on type 'Computed'如何解决
错误原因
- 这是TypeScript静态类型检查抛出的编译错误,和实际运行逻辑无关。你用
mapGetters映射Vuex getter到组件计算属性时,TypeScript默认无法自动推导isAdmin的具体类型,会将它识别为通用的Computed类型,该类型没有提前声明authorities属性,因此触发类型报错。 - 运行时代码走的是原生JavaScript弱类型逻辑,只要实际返回值存在
authorities属性就能正常执行,所以控制台打印结果正常。
解决方案
快速临时修复(适合小项目/临时调试)
给isAdmin做类型断言,告诉TypeScript它的实际类型:
- 先定义用户结构的类型:
interface CurrentUser { authorities: string[] // 可补充其他用户字段 }
- 访问属性前做类型转换:
isUserAdmin() : boolean{ const currentUser = this.isAdmin as CurrentUser console.log(currentUser.authorities.includes('Admin')); return currentUser.authorities.includes('Admin'); }
如果追求更简单的写法可以直接用(this.isAdmin as any).authorities,但不推荐,会丢失类型检查能力。
长期规范修复(适合正式项目维护)
给Vuex getters做全局类型声明,或者改用带类型标注的组件写法:
方案1:Options API写法
给展开的mapGetters手动标注类型:
// Vue2 用 Vue.extend,Vue3 用 defineComponent export default Vue.extend({ name: "UserSettingsTabs", computed: { ...mapGetters({ preferences: 'tab/preferences', administrations: 'tab/administrations', isAdmin: 'auth/currentUser' }) as { preferences: YourPreferencesType // 替换为对应实际类型 administrations: YourAdminType // 替换为对应实际类型 isAdmin: { authorities: string[] } }, isUserAdmin() : boolean{ return this.isAdmin.authorities.includes('Admin'); } }, })
方案2:类组件写法(Vue2推荐)
用vue-property-decorator的@Getter装饰器直接指定类型,更清晰:
import { Vue, Component, Getter } from 'vue-property-decorator' @Component export default class UserSettingsTabs extends Vue { @Getter('auth/currentUser') isAdmin: { authorities: string[] } get isUserAdmin(): boolean { return this.isAdmin.authorities.includes('Admin') } }
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

