immer
immer copied to clipboard
The return type of the produce method will have an additional undefined
🙋♂ Question
A clear and concise description of what the question is. In general we recommend to use Stack Overflow for questions. Questions typically are processed with less priority.
import { produce } from 'immer';
const func = produce((state: Record<string, string> = {}): Record<string, string> => {
return state;
});
In the above code, I expect the type of the func to be Record<string, string>, but the actual type check returns Record<string, string> | undefined, how can I avoid the undefined?

This problem only occurs in 9.x versions
Link to repro
https://codesandbox.io/s/immer-sandbox-forked-n1okz2?file=/src/index.ts
Environment
We only accept questions against the latest Immer version.
- Immer version:
- [ ] Occurs with
setUseProxies(true) - [ ] Occurs with
setUseProxies(false)(ES5 only)
remove the default assignment and it will work. state = {} will inner state to Record<string,string> | undefined.
type InferCurriedFromRecipe<
Recipe,
UsePatches extends boolean
> = Recipe extends (draft: infer DraftState, ...args: infer RestArgs) => any // verify return type
? ReturnType<Recipe> extends ValidRecipeReturnTypePossiblyPromise<DraftState>
? (
base: Immutable<DraftState>,
...args: RestArgs
) => PromisifyReturnIfNeeded<DraftState, Recipe, UsePatches> // N.b. we return mutable draftstate, in case the recipe's first arg isn't read only, and that isn't expected as output either
: never // incorrect return type
: never // not a function
@mweststrate maybe produce function should explicitly return draft to avoid this situation?
recipes should not use a default argument, as they are never seen by produce. produce would indeed in such a case indeed return undefined, so the inferred type is correct.