Git Product home page Git Product logo

Comments (9)

coffee-cup avatar coffee-cup commented on May 2, 2024 13

I have found this middleware type useful

type Middleware<S> = (
  config: StateCreator<S>,
) => (set: SetState<S>, get: GetState<S>, api: StoreApi<S>) => S;

const log: Middleware<StoreType> = config => (set, get, api) =>
  config(args => {
    console.log("  applying", args)
    set(args)
    console.log("  new state", get())
}, get, api);

from zustand.

JeremyRH avatar JeremyRH commented on May 2, 2024 3

Ah sorry, I misunderstood you. The types are exported so you can use them:

import create, { StateCreator, SetState, GetState, StoreApi } from 'zustand'

interface YourState {
  a: number,
  b: string
}

const log = (config: StateCreator<YourState>) => (
  set: SetState<YourState>,
  get: GetState<YourState>,
  api: StoreApi<YourState>
) => config(args => {
  console.log("  applying", args)
  set(args)
  console.log("  new state", get())
}, get, api)

from zustand.

alexluong avatar alexluong commented on May 2, 2024 1

@JeremyRH I agree that plain JS is very accessible to everybody. However, when writing middleware, I'm not sure how to properly type things. Therefore, I'd love an example here, even if it's not gonna make it to the doc itself.

For example:

const log = config => (set, get, api) => config(args => {
  console.log("  applying", args)
  set(args)
  console.log("  new state", get())
}, get, api)

What are config, set, get, api types? Not that it's breaking anything, but I'd love to properly type my middleware.

Thanks!

from zustand.

savissimo avatar savissimo commented on May 2, 2024 1

I have found this middleware type useful

type Middleware<S> = (
  config: StateCreator<S>,
) => (set: SetState<S>, get: GetState<S>, api: StoreApi<S>) => S;

const log: Middleware<StoreType> = config => (set, get, api) =>
  config(args => {
    console.log("  applying", args)
    set(args)
    console.log("  new state", get())
}, get, api);

Sorry, what is StoreType?

from zustand.

JeremyRH avatar JeremyRH commented on May 2, 2024

I like that the examples are plain JS, it makes them more accessible. I also don't want to add too much noise to the readme. Maybe next to some examples we can provide a link to a typescript version using the typescript playground.

from zustand.

alexluong avatar alexluong commented on May 2, 2024

Thank you! This is really helpful.

from zustand.

kurosh-z avatar kurosh-z commented on May 2, 2024

@JeremyRH
hey !
how to write types when use it with immer ?

I defined types like:

interface IState {
  currentGroup: object | null;
  GroupIndex: number;
  palying: boolean;
}

const myStore = (set: SetState<IState>) => ({
  currentGroup: null,
  GroupIndex: 0,
  playing: false,

  setCurrentGroup: (group: object) =>
    set((state) => {
      state.currentGroup = group;
    })
});

const immer = (config: StateCreator<IState>) => (
  set: SetState<IState>,
  get: GetState<IState>,
  api: StoreApi<IState>
) => config((fn) => set(produce(fn)), get, api);

export const useStore = immer(myStore);

Screen Shot 2020-08-31 at 11 46 38 PM

Screen Shot 2020-08-31 at 11 47 20 PM

sandbox: https://codesandbox.io/s/pedantic-flower-immerzustand-rh070?file=/src/App.tsx:196-713

from zustand.

dai-shi avatar dai-shi commented on May 2, 2024

@kurosh-z Hey, I fixed it recently. Please check the example in #169. If it doesn't work, would you please file a new issue?

from zustand.

danielrotaermel avatar danielrotaermel commented on May 2, 2024

Thank you @coffee-cup! I had to use: type Middleware<S extends State> to make it work

I have found this middleware type useful

type Middleware<S extends State> = (
  config: StateCreator<S>,
) => (set: SetState<S>, get: GetState<S>, api: StoreApi<S>) => S;

const log: Middleware<StoreType> = config => (set, get, api) =>
  config(args => {
    console.log("  applying", args)
    set(args)
    console.log("  new state", get())
}, get, api);

from zustand.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.