Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ktsn/vuex-type-helper

Type level helper to ensure type safety in Vuex
https://github.com/ktsn/vuex-type-helper

type type-safety typescript vue vuex

Last synced: 3 months ago
JSON representation

Type level helper to ensure type safety in Vuex

Awesome Lists containing this project

README

        

# Vuex Type Helper

Type level helper to ensure type safety in Vuex.

## Installation

```bash
# npm
$ npm install vuex-type-helper

# yarn
$ yarn add vuex-type-helper
```

## Example

```ts
import * as Vuex from 'vuex'
import { DefineGetters, DefineMutations, DefineActions, Dispatcher, Committer } from 'vuex-type-helper'

/**
* Declare module types
*/
export interface CounterState {
count: number
}

export interface CounterGetters {
// getterName: returnType
half: number
}

export interface CounterMutations {
// mutationName: mutationPayloadType
inc: {
amount: number
}
reset: void // having no payload
}

export interface CounterActions {
// actionName: actionPayloadType
incAsync: {
amount: number
delay: number
}
reset: void // having no payload
}

/**
* Implement the module
*/
const state: CounterState = {
count: 0
}

const getters: DefineGetters = {
half: state => state.count / 2
}

const mutations: DefineMutations = {
inc (state, { amount }) {
state.count += amount
},

reset(state) {
state.count = 0
}
}

const actions: DefineActions = {
incAsync ({ commit }, payload) {
setTimeout(() => {
commit('inc', payload)
}, payload.delay)
},

reset({ commit }) {
commit('reset')
}
}

/**
* Create a store as same as the ordinary way
*/
const store = new Vuex.Store({
state,
getters,
mutations,
actions
})

/**
* Annotate dispatch/commit type with declared actions/mutations type
*/
store.dispatch>({
type: 'incAsync',
amount: 1,
delay: 1000
})

store.dispatch>({
type: 'reset'
})

store.commit>({
type: 'inc',
amount: 1
})

store.commit>({
type: 'reset'
})
```

## License

MIT