vuex-typex

Typescript builder for strongly-typed access to Vuex Store modules

  • 所有者: mrcrowl/vuex-typex
  • 平台:
  • 許可證: MIT License
  • 分類:
  • 主題:
  • 喜歡:
    0
      比較:

Github星跟蹤圖

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()
})

主要指標

概覽
名稱與所有者mrcrowl/vuex-typex
主編程語言TypeScript
編程語言TypeScript (語言數: 2)
平台
許可證MIT License
所有者活动
創建於2017-06-11 11:53:40
推送於2023-01-06 01:38:37
最后一次提交2022-05-22 10:31:39
發布數9
最新版本名稱v3.1.8 (發布於 )
第一版名稱v1.0.8 (發布於 )
用户参与
星數191
關注者數8
派生數21
提交數50
已啟用問題?
問題數26
打開的問題數6
拉請求數14
打開的拉請求數5
關閉的拉請求數8
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?