使用mapGetters
时,TypeScript无法查看绑定到Vue组件的getter的内容,因此会抛出错误。例如:
import Vue from 'vue';
import { mapActions, mapGetters } from 'vuex';
export default Vue.extend({
computed: {
...mapGetters('ui', ['navCollapsed']),
minimizerIconClass(): string {
return `fa${this.navCollapsed ? '' : 'r'} fa-window-maximize`;
},
},
TypeScript大肆宣传this.navCollapsed
:
TS2339: Property 'navCollapsed' does not exist on type 'CombinedVueInstance<Vue, {}, { openMobileMenu(): void; }, { minimizerIconClass: string; }, Readon...'.
我该如何解决这个问题?我能想出的唯一解决方法是不使用mapGetters()
。
答案 0 :(得分:3)
我建议将vuex-class用于带有Typescript的装饰器。
但是如果你不想要额外的依赖,我相信使用this['navCollapsed']
而不是this.navCollapsed
可以解决编译错误。
答案 1 :(得分:0)
我遇到了同样的问题,并执行了以下操作:
declare module "vuex" {
interface TMapGetters {
<TGetters>(getterNames: Array<keyof TGetters>): Partial<TGetters>;
}
export const mapGetters: TMapGetters;
}
然后在我的商店中定义:
interface TGetters {
navCollapsed: boolean;
}
现在在我的组件中,我可以执行以下操作:
type TThis = TGetters & TData & TMethods & TComputed & TProps;
export default Vue.extend<TData, TMethods, TComputed, TProps>({
computed: {
...mapGetters<TGetters>([
'navCollapsed',
],
minimizerIconClass(this: TThis): string {
return `fa${this.navCollapsed ? '' : 'r'} fa-window-maximize`;
}
}
}
远非完美,但它将检测传递给mapGetters
的数组中的错别字,并允许您在this
上使用(正确键入的)getter。
但是,TypeScript将不知道您是否确实映射了有问题的吸气剂。