immer icon indicating copy to clipboard operation
immer copied to clipboard

The return type of the produce method will have an additional undefined

Open JaneSu opened this issue 2 years ago • 4 comments

🙋‍♂ 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?

image

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)

JaneSu avatar Dec 28 '22 09:12 JaneSu

remove the default assignment and it will work. state = {} will inner state to Record<string,string> | undefined.

childrentime avatar Feb 05 '23 14:02 childrentime

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

 

childrentime avatar Feb 05 '23 14:02 childrentime

@mweststrate maybe produce function should explicitly return draft to avoid this situation?

childrentime avatar Feb 06 '23 03:02 childrentime

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.

mweststrate avatar Feb 06 '23 09:02 mweststrate