Weboldal keresés

typescript - A Zustand tároló `set` metódusának típusozása Immer middleware-rel, miközben megmarad az automatikus kiegészítés


Problémám van a Zustand tárolóból származó set metódus típusának meghatározásával az Immer köztes réteg használata közben. Tényleg szükségem van a típusára, mivel néhány tulajdonság olyan függvényeket tartalmaz, amelyek frissítik az állapotot, tehát szükségük van a set függvényre:

export const useStore = create<Store>()(
     immer((set, get) => ({
         func: beginDraggingVertex(set, get, vertexID) 
     }))
)     

....

function beginDraggingVertex(set: Setter, get: Getter, vertexID: string) {
  ...ommited
  set((store) => 
   // here is where I do want to have the autocomplete working
   store.whateverProperty = 'hi'
  )

}

Ha eltávolítom az Immer middleware-t a store-ból, amikor a set metódus fölé viszem az egeret, megkapom a típusát, így később a beginDraggingVertex deklarációs argumentumait is típusozhatom. De ha az Immer-t alkalmazom, a set metódus megváltozik, és ha a set típusát az új típusra változtatom, elvesztem az automatikus kiegészítést.

 //`set` type with Immer applied, with this one I loose autocomplete wihtin:
 type Setter = (
  nextStateOrUpdater:
    | (Store & ActionsObject)
    | Partial<Store & ActionsObject>
    | ((state: WritableDraft<Store & ActionsObject>) => void),
  shouldReplace?: boolean | undefined
) => void

//`set` type without Immer:
 export type Setter = (
  partial:
    | (Store & ActionsObject)
    | Partial<Store & ActionsObject>
    | ((state: Store & ActionsObject) => (Store & ActionsObject) | Partial<Store & ActionsObject>),
  replace?: boolean | undefined
) => void


Ha alkalmazom az Immer-t, majd a set-nek az eredeti típust adom, amikor ez nem volt alkalmazva, természetesen kapok automatikus kiegészítést, de mindenképpen kapok ezeket a hibákat a set visszahívásban:

I was expecting (Store & ActionsObject) | Partial<Store & ActionsObject> | ((state: Store & ActionsObject) => (Store & ActionsObject) | Partial<...>), but you passed (store: Store & ActionsObject) => void

Nagyon értékelem bármilyen segítséget, amit nyújtani tudna.