vuex-typex

Typescript builder for strongly-typed access to Vuex Store modules

  • Owner: mrcrowl/vuex-typex
  • Platform:
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

Vuex-Typex

A TypeScript pattern for strongly-typed access to Vuex Store modules

I really like vuex-typescript by @istrib

I just wanted to take the ideas bit further.

My main changes are:

  • Avoid passing $store/context to the accessor methods: we can encapsulate these within the accessors by providing the store later:
    i.e. basket.commitAppendItem(newItem) should be sufficient.
  • No need to distinguish between payload / payload-less versions of commit + dispatch.
    Typescript overloads solve this problem.
  • Promises returned from dispatch should be strongly-typed.
  • Assumes namespaced modules

I also took the point of view that we don't need to start with a vuex-store options object. If we treat the accessor-creator as a builder, then the store can be generated:

import { getStoreBuilder, BareActionContext } from "vuex-typex"
import Vuex, { Store } from "vuex"
import Vue from "vue"
const delay = (duration: number) => new Promise((c, e) => setTimeout(c, duration))

Vue.use(Vuex)

export interface RootState { basket: BasketState }
export interface BasketState { items: Item[] }
export interface Item { id: string, name: string }

const storeBuilder = getStoreBuilder<RootState>()
const moduleBuilder = storeBuilder.module<BasketState>("basket", { items: [] })

namespace basket
{
    const appendItemMutation = (state: BasketState, payload: { item: Item }) => state.items.push(payload.item)
    const delayedAppendAction = async (context: BareActionContext<BasketState, RootState>) =>
    {
        await delay(1000)
        basket.commitAppendItem({ item: { id: "abc123", name: "ABC Item" } })
    }

    export const commitAppendItem = moduleBuilder.commit(appendItemMutation)
    export const dispatchDelayedAppend = moduleBuilder.dispatch(delayedAppendAction)
}
export default basket

/// in the main app file
const storeBuilder = getStoreBuilder<RootState>()
new Vue({
    el: '#app',
    template: "....",
    store: storeBuilder.vuexStore()
})

Main metrics

Overview
Name With Ownermrcrowl/vuex-typex
Primary LanguageTypeScript
Program languageTypeScript (Language Count: 2)
Platform
License:MIT License
所有者活动
Created At2017-06-11 11:53:40
Pushed At2023-01-06 01:38:37
Last Commit At2022-05-22 10:31:39
Release Count9
Last Release Namev3.1.8 (Posted on )
First Release Namev1.0.8 (Posted on )
用户参与
Stargazers Count191
Watchers Count8
Fork Count21
Commits Count50
Has Issues Enabled
Issues Count26
Issue Open Count6
Pull Requests Count14
Pull Requests Open Count5
Pull Requests Close Count8
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private