immer icon indicating copy to clipboard operation
immer copied to clipboard

Incorrect type inference with currying

Open sarmong opened this issue 4 years ago • 2 comments

🐛 Bug Report

When using currying, produce doesn't return the original type

Link to repro

https://codesandbox.io/s/immer-sandbox-forked-342jd?file=/src/index.ts

To Reproduce

Use produce function without data and check the return type.

Observed behavior

Curried produce returns:

const updatedCache2: (oldAssignments: Assignment[]) => <Base extends readonly {
    readonly assignmentBk: string;
    readonly contentBk: string;
    readonly createdDate: Date;
    readonly startDate: Date;
    readonly dueDate: Date;
    readonly done: boolean;
}[]>(base?: Base) => Base

Expected behavior

Curried produce returns the original type.

I need it, because it fails when using with Ramda's pipe function.

Environment

We only accept bug reports against the latest Immer version.

  • Immer version: 8.0.1
  • [x] I filed this report against the latest version of Immer
  • [x] Occurs with setUseProxies(true)
  • [x] Occurs with setUseProxies(false) (ES5 only)

sarmong avatar Jul 17 '21 08:07 sarmong

For the function updateCache2 , arguments will be narrow to Immutable<Assignment[]>. If we don't want this, we can specify the generic state. However, type of function updatedCache3 is (state: Assignment[] | undefined) => Assignment[] .Maybe this '?' can be removed?

<State>(
  recipe: (
	  state: Draft<State>,
	  initialState: State
              ) => ValidRecipeReturnType<State>
): (state?: State) => State

childrentime avatar Jun 05 '22 03:06 childrentime

it seems like this function

const updatedCache3 = produce<Assignment[]>((draft) => {
  const updatedAssignment = draft.find(
    ({contentBk}) => contentBk === assignment.contentBk
  )
  if (updatedAssignment) {
    updatedAssignment.done = !updatedAssignment.done
  }
})

will map to

 <State>(recipe: (state: Draft<State>, initialState: State) => ValidRecipeReturnType<State>): (state?: State) => State;

not map to

  <State>(recipe: (state: Draft<State>) => ValidRecipeReturnType<State>): (state: State) => State;

childrentime avatar Jun 05 '22 03:06 childrentime