From: Eduardo San Martin Morote Date: Tue, 27 Apr 2021 12:52:27 +0000 (+0200) Subject: feat: wip pass state to getters X-Git-Tag: v2.0.0-alpha.14~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5e5cdc1c0ebb03edcb6e4bcab8989d1e0bc54afa;p=thirdparty%2Fvuejs%2Fpinia.git feat: wip pass state to getters --- diff --git a/__tests__/getters.spec.ts b/__tests__/getters.spec.ts index 28352989..270d756c 100644 --- a/__tests__/getters.spec.ts +++ b/__tests__/getters.spec.ts @@ -19,6 +19,19 @@ describe('Getters', () => { composed(): string { return this.upperCaseName + ': ok' }, + arrowUpper: (state) => { + // @ts-expect-error + state.nope + state.name.toUpperCase() + }, + }, + actions: { + o() { + // @ts-expect-error it should type getters + this.arrowUper.toUpperCase() + this.o().toUpperCase() + return 'a string' + }, }, })() } @@ -42,6 +55,10 @@ describe('Getters', () => { it('adds getters to the store', () => { const store = useStore() expect(store.upperCaseName).toBe('EDUARDO') + + // @ts-expect-error + store.nope + store.name = 'Ed' expect(store.upperCaseName).toBe('ED') }) diff --git a/__tests__/storePlugins.spec.ts b/__tests__/storePlugins.spec.ts index ef75b81e..d93f354e 100644 --- a/__tests__/storePlugins.spec.ts +++ b/__tests__/storePlugins.spec.ts @@ -17,6 +17,8 @@ describe('store plugins', () => { const useStore = defineStore({ id: 'test', + state: () => ({ n: 0 }), + actions: { incrementN() { return this.n++ diff --git a/src/store.ts b/src/store.ts index 73060a8a..21673567 100644 --- a/src/store.ts +++ b/src/store.ts @@ -289,9 +289,8 @@ let isDevWarned: boolean | undefined export function defineStore< Id extends string, S extends StateTree, - // the omission of the extends is necessary for type inference G extends GettersTree, - A /* extends Record */ + A /* extends Record */ >(options: DefineStoreOptions): StoreDefinition { const { id, state, getters, actions } = options diff --git a/src/types.ts b/src/types.ts index e8818036..ca6cfba4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -26,14 +26,6 @@ export function isPlainObject( ) } -/** - * Store Getter - * @internal - */ -export interface StoreGetter { - (state: S, getters: Record>): T -} - export type DeepPartial = { [K in keyof T]?: DeepPartial } // type DeepReadonly = { readonly [P in keyof T]: DeepReadonly } @@ -129,12 +121,7 @@ export type StoreWithActions = { * @internal */ export type StoreWithGetters = { - readonly [k in keyof G]: G[k] extends ( - this: infer This, - store?: any - ) => infer R - ? R - : never + readonly [k in keyof G]: G[k] extends (...args: any[]) => infer R ? R : never } // // in this type we forget about this because otherwise the type is recursive diff --git a/test-dts/store.test-d.ts b/test-dts/store.test-d.ts index cabd1f7f..8db5bb85 100644 --- a/test-dts/store.test-d.ts +++ b/test-dts/store.test-d.ts @@ -16,6 +16,11 @@ const useStore = defineStore({ expectType(this.upper) return false }, + + doubleCounter: (state) => { + expectType(state.nested.counter) + return state.nested.counter * 2 + }, }, actions: { doStuff() {