Incorrect type inference with currying
🐛 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)
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
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;