You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript+Vuex项目报Property 'authorities' does not exist on type 'Computed'如何解决

错误原因
  • 这是TypeScript静态类型检查抛出的编译错误,和实际运行逻辑无关。你用mapGetters映射Vuex getter到组件计算属性时,TypeScript默认无法自动推导isAdmin的具体类型,会将它识别为通用的Computed类型,该类型没有提前声明authorities属性,因此触发类型报错。
  • 运行时代码走的是原生JavaScript弱类型逻辑,只要实际返回值存在authorities属性就能正常执行,所以控制台打印结果正常。
解决方案

快速临时修复(适合小项目/临时调试)

给isAdmin做类型断言,告诉TypeScript它的实际类型:

  1. 先定义用户结构的类型:
interface CurrentUser {
  authorities: string[]
  // 可补充其他用户字段
}
  1. 访问属性前做类型转换:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:24:01