I want to set up a Vuex 4 Store with Typescript and Vue3. I have almost no experience with typescript.
I followed the Vuex Tutorial for the initial setup, almost copy paste. The only different element is that in my State interface I have a key of type Station.
I get this error
TS2345: Argument of type '{ station: {}; isOverlayActive: boolean; }' is not assignable to parameter of type 'StoreOptions<State>'.
Object literal may only specify known properties, and 'station' does not exist in type 'StoreOptions<State>'.
This is my Station interface
export default interface Station {
uuid: string;
name: string;
teaser: {
src: string;
title: string;
};
event: {
uuid: string;
name: string;
logo: {
src: string;
title: string;
};
};
logo: {
src: string;
title: string;
};
theme: {
mainColor: string;
textColor: string;
};
}
and this is my index.ts where I'm defining the store, and where I get the error
import { InjectionKey } from "vue";
import { createStore, useStore as baseUseStore, Store } from "vuex";
import Station from "@/interfaces/station";
export interface State {
station: Station;
isOverlayActive: boolean;
}
export const key: InjectionKey<Store<State>> = Symbol();
export const store = createStore<State>({
station: {}, // here the compiler shows the error
isOverlayActive: false,
});
export function useStore(): Store<State> {
return baseUseStore(key);
}
I think that the Station is not causing the problem, I tried also to set station: number in the Store interface and to set station: 0 in store but I get the same error.
What am I doing wrong? The goal is to have a typed store.
CodePudding user response:
In the createStore function you need to wrap it in the property state.
https://vuex.vuejs.org/guide/typescript-support.html#simplifying-usestore-usage
Instead of
export const store = createStore<State>({
station: {}, // here the compiler shows the error
isOverlayActive: false,
});
It's
export const store = createStore<State>({
state: {
station: {},
isOverlayActive: false,
}
});
It will still throw an error since uuid, name, etc. are not defined by {} but thats another error.
