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

如何在Vue文件中获取Vuex Getter的类型?

解决Vuex getter在Vue组件中类型丢失的问题

当使用mapGetters引入Vuex getter时,默认情况下TypeScript无法自动推导其类型,导致显示为any。以下是无需手动在组件中显式指定类型的解决方案:

1. 提取Getter的类型定义

首先在getters.ts中导出getters的类型,让TypeScript能识别所有getter的结构:

// getters.ts
import { GetterTree } from "vuex";
import { RootState } from "./state";

const getters: GetterTree<RootState, RootState> = {
  getTodos: (state: RootState) => state.todos,
};

// 导出getters的类型,供后续类型推导使用
export type RootGetters = typeof getters;
export default getters;

2. 封装类型安全的mapGetters辅助函数

创建一个工具函数,基于你的RootGetters类型约束传入的getter名称,并自动推导返回值类型:

// utils/typed-vuex.ts
import { mapGetters } from "vuex";
import type { RootGetters } from "@/store/getters";

// 限制只能传入RootGetters中存在的key,并自动推导每个getter的返回类型
export const mapTypedGetters = <K extends keyof RootGetters>(getterNames: K[]) => {
  return mapGetters(getterNames) as { [Key in K]: ReturnType<RootGetters[Key]> };
};

3. 在Vue组件中使用类型化的辅助函数

在组件中替换默认的mapGetters为我们封装的mapTypedGetters,此时getter的类型会被自动推导:

<script setup lang="ts">
import { mapTypedGetters } from "@/utils/typed-vuex";

// getTodos的类型会自动识别为Todo[],无需手动指定
const { getTodos } = mapTypedGetters(["getTodos"]);
</script>

替代方案:直接在computed中类型推导(不推荐)

如果不想封装辅助函数,也可以直接在computed中基于RootGetters类型推导,但这种方式需要重复编写逻辑,不够优雅:

<script setup lang="ts">
import { mapGetters } from "vuex";
import type { RootGetters } from "@/store/getters";

const computedProps = {
  ...mapGetters(["getTodos"]),
} as {
  getTodos: ReturnType<RootGetters["getTodos"]>;
};

// 解构后使用
const { getTodos } = computedProps;
</script>

原理说明

默认的mapGetters没有绑定到你的自定义getter类型,所以TypeScript无法推断其返回值类型。通过提取RootGetters类型并封装辅助函数,我们让TypeScript能关联到每个getter的具体类型,从而实现自动推导。

内容的提问来源于stack exchange,提问作者Adinai Zhamangulova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:35:10