Skip to content

Commit

Permalink
feat: support optional payload
Browse files Browse the repository at this point in the history
  • Loading branch information
zcf0508 committed Jan 5, 2024
1 parent e7e096d commit cb892d8
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 14 deletions.
22 changes: 11 additions & 11 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ import Vuex, {
} from 'vuex'
import type { ActionContext, Store as VuexStore } from 'vuex'
import type { ComputedGetter } from 'vue'
import type { And, GetModulesKeys, HasDefinedAndNotAny, UnionToIntersection } from './utils'
import type { And, GetModulesKeys, HasDefinedAndNotAny, HasDefinedAndNotAnyAndNonOptional, UnionToIntersection } from './utils'
import { IS_VUEX_3 } from './helper'

interface ModuleCommit<MUTATIONS> {
<T extends keyof MUTATIONS, P extends MUTATIONS[T]>(type: HasDefinedAndNotAny<P> extends true ? never : T, payload?: undefined): void
<T extends keyof MUTATIONS, P extends MUTATIONS[T]>(type: HasDefinedAndNotAny<P> extends true ? never : T, payload?: P | undefined): void
<T extends keyof MUTATIONS, P extends MUTATIONS[T]>(type: T, payload: HasDefinedAndNotAny<P> extends true ? P : undefined): void
<T extends keyof MUTATIONS>(input: { type: T } & MUTATIONS[T]): void
}

interface ModuleDispatch<ACTIONS> {
<T extends keyof ACTIONS, P extends ACTIONS[T]>(type: HasDefinedAndNotAny<P> extends true ? never : T, payload?: undefined): Promise<any>
<T extends keyof ACTIONS, P extends ACTIONS[T]>(type: HasDefinedAndNotAny<P> extends true ? never : T, payload?: P | undefined): Promise<any>
<T extends keyof ACTIONS, P extends ACTIONS[T]>(type: T, payload: HasDefinedAndNotAny<P> extends true ? P : undefined): Promise<any>
<T extends keyof ACTIONS>(input: { type: T } & ACTIONS[T]): Promise<any>
}
Expand Down Expand Up @@ -187,7 +187,7 @@ type StoreCommit<MODULES, MUTATIONS> =
: K extends keyof MUTATIONS
? MUTATIONS[K]
: undefined),
>(type: HasDefinedAndNotAny<P> extends true ? never : K extends string ? K : never, payload?: HasDefinedAndNotAny<P> extends false ? P | undefined : never): void
>(type: HasDefinedAndNotAnyAndNonOptional<P> extends true ? never : K extends string ? K : never, payload?: HasDefinedAndNotAny<P> extends false ? P | undefined : never): void

<
MS extends FlattenMutations<
Expand Down Expand Up @@ -234,11 +234,11 @@ type StoreDispatch<MODULES, ACTIONS> =
P extends (K extends keyof AS
? AS[K] extends (...args: any) => any
? Parameters<AS[K]>[1]
: undefined
: never
: K extends keyof ACTIONS
? ACTIONS[K]
: undefined),
>(type: HasDefinedAndNotAny<P> extends true ? never : K, payload?: HasDefinedAndNotAny<P> extends false ? P | undefined : never): Promise<any>
: never),
>(type: HasDefinedAndNotAnyAndNonOptional<P> extends true ? never : K, payload?: P | undefined): Promise<any>

<
AS extends FlattenActions<
Expand Down Expand Up @@ -363,14 +363,14 @@ interface MapMutations<MUTATIONS, MODULES> {
>(namespace: MODULES_KEYS, map: MAP): {
[K in keyof MAP]: HasDefinedAndNotAny<MAP[K] extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[MAP[K]] : never> extends true
? (payload: MAP[K] extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[MAP[K]] : never) => void
: (payload?: (MAP[K] extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[MAP[K]] : never) | undefined) => void
: (payload?: (MAP[K] extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[MAP[K]] | undefined : never) | undefined) => void
}
<
MODULES_KEYS extends keyof MODULES, ALL_KEYS extends keyof (MODULES[MODULES_KEYS] extends NSModule<any, any, any, any, any> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]> : never), MAP_ITEM extends string,
>(namespace: MODULES_KEYS, map: MAP_ITEM[]): {
[K in MAP_ITEM extends ALL_KEYS ? MAP_ITEM : never]: HasDefinedAndNotAny<K extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[K] : never> extends true
? (payload: K extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[K] : never) => void
: (payload?: (K extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[K] : never) | undefined) => void
: (payload?: (K extends keyof PickNSModuleMutaions<MODULES[MODULES_KEYS]> ? PickNSModuleMutaions<MODULES[MODULES_KEYS]>[K] | undefined : never) | undefined) => void
}
}

Expand Down Expand Up @@ -418,14 +418,14 @@ interface MapActions<ACTIONS, MODULES> {
>(namespace: MODULES_KEYS, map: MAP): {
[K in keyof MAP]: HasDefinedAndNotAny<MAP[K] extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[MAP[K]] : never> extends true
? (payload: MAP[K] extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[MAP[K]] : never) => any
: (payload?: (MAP[K] extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[MAP[K]] : never) | undefined) => any
: (payload?: (MAP[K] extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[MAP[K]] | undefined : never) | undefined) => any
}
<
MODULES_KEYS extends keyof MODULES, ALL_KEYS extends keyof (MODULES[MODULES_KEYS] extends NSModule<any, any, any, any, any> ? PickNSModuleActions<MODULES[MODULES_KEYS]> : never), MAP_ITEM extends string,
>(namespace: MODULES_KEYS, map: MAP_ITEM[]): {
[K in MAP_ITEM extends ALL_KEYS ? MAP_ITEM : never]: HasDefinedAndNotAny<K extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[K] : never> extends true
? (payload: K extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[K] : never) => any
: (payload?: (K extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[K] : never) | undefined) => any
: (payload?: (K extends keyof PickNSModuleActions<MODULES[MODULES_KEYS]> ? PickNSModuleActions<MODULES[MODULES_KEYS]>[K] | undefined : never) | undefined) => any
}
}

Expand Down
12 changes: 12 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,20 @@ type Equal<Left, Right> =
(<U>() => U extends Left ? 1 : 0) extends (<U>() => U extends Right ? 1 : 0) ? true : false

type IsAny<T> = Equal<T, any> extends true ? true : false

export type IsNever<T> = Equal<T, never> extends true ? true : false

type IsOptional<T> = Equal<T | undefined, T>

export type HasDefinedAndNotAnyAndNonOptional<T> =
IsAny<T> extends true
? false
: Equal<T, unknown> extends true
? false
: IsOptional<T> extends true
? false
: true

export type HasDefinedAndNotAny<T> =
IsAny<T> extends true
? false
Expand Down
9 changes: 6 additions & 3 deletions test/index3.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ describe('vuex', () => {
namespaced: true,
state: { a: '1', b: 2 },
mutations: {
UPDATE(state, payload: string) {
state.a = payload
UPDATE(state, payload?: string) {
state.a = payload || ''
},
UPDATE2(state, payload: number) {
state.b = payload
Expand All @@ -155,7 +155,7 @@ describe('vuex', () => {
commit('UPDATE', '2')
dispatch('add_b')
},
update2({ commit }, payload: string) {
update2({ commit }, payload?: string) {
commit('UPDATE', payload)
},
add_b({ commit }) {
Expand Down Expand Up @@ -207,10 +207,13 @@ describe('vuex', () => {
expect(testStore2.getters.username).toBe('333')

testStore2.commit('SET_NAME', '222')
testStore2.commit('m1/UPDATE')
testStore2.commit('m1/UPDATE', '333')
testStore2.commit('m1/UPDATE2', 2)

testStore2.dispatch('setName', '333')
testStore2.dispatch('m1/update')
testStore2.dispatch('m1/update2')
testStore2.dispatch('m1/update2', '2')
testStore2.dispatch('update2')

Expand Down

0 comments on commit cb892d8

Please sign in to comment.