65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 TypeScript 正确地类型化 Vuex

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2021年5月5日

CPOL

1分钟阅读

viewsIcon

22843

downloadIcon

225

使用 TypeScript 对 Vuex 进行静态类型化的教程

我们的示例 Vuex Store

在本教程中,我将创建一个 Vuex store 来存储苹果和橙子。苹果和橙子将拥有各自独立的模块,根 store 将聚合这两个模块。

苹果模块

让我们看一下 Apple 模块的第一个实现,位于 @/store/AppleModule.ts

import { Apple } from "@/models/Apple";

export interface ApplesState {
    items: Array<Apple>
}

export default {
    namespaced: true,
    state: (): ApplesState => ({
      items: Array<Apple>()
    }),
    mutations: {
        setApples: function(state: ApplesState, apples: Array<Apple>): void {
          state.items = apples;
        }
    }
}

这个模块在其 state 中有一个属性,一个苹果数组,以及一个 mutation,用于设置这个数组。state 的类型由 ApplesState 接口声明,该接口用作 mutation 中 state 参数的类型。

让我们在 @/store/intex.ts 中包含这个模块

import Vue from 'vue'
import Vuex from 'vuex'
import appleModule, { ApplesState } from './AppleModule'

Vue.use(Vuex)
export interface State {
  apples: ApplesState;
}

export default new Vuex.Store<State>({
  modules: {
    apples: appleModule
  }
})
我们使用 State 接口声明根 state 的类型。我们将 State 作为类型参数传递给 Vuex.Store 实例。

Actions 和 Context

为了在 store 模块中定义 actions,我们需要一个 Context 类型。为此,我们需要将根 state 类型导入到我们的苹果模块中,并使用它来定义 Context 类型。

import { ActionContext } from "vuex";
import { State } from '.';

type Context = ActionContext<ApplesState, State>;

现在,您可以在 action 定义中使用这个 Context 类型

loadApples: async function(context: Context): Promise<Array<Apple>> {
  const apples = (await axios.get('apples')).data;
  context.commit('setApples', apples);
  return context.state.items;
}

橙子模块

橙子模块的实现方式与苹果类似。毕竟它们不像苹果和橙子一样...

import Vue from 'vue'
import Vuex from 'vuex'
import appleModule, { ApplesState } from './AppleModule'
import orangeModule, { OrangesState } from './OrangeModule'

Vue.use(Vuex)

export interface State {
  apples: ApplesState;
  oranges: OrangesState;
}

export default new Vuex.Store<State>({
  modules: {
    apples: appleModule,
    oranges: orangeModule
  }
})

历史

  • 2021 年 5 月 4 日:第一个版本
© . All rights reserved.