I am doing something like the following:
import React from "react";
interface BaseFormValue {
name: string;
}
export interface NewFormValue extends BaseFormValue {
email: string;
}
export interface ExistingFormValue extends BaseFormValue {}
export type FormValue = NewFormValue | ExistingFormValue;
export type existingFormSetter = (
setter: (prev: ExistingFormValue) => ExistingFormValue
) => void;
export type newFormSetter = (
setter: (prev: NewFormValue) => NewFormValue
) => void;
export type formSetter = existingFormSetter & newFormSetter;
let newFormState: NewFormValue = {
name: "",
email: "",
};
const newFormSetter: newFormSetter = (setter) => {
newFormState = setter(newFormState);
};
type NewFormProps = {
type: "new";
value: NewFormValue;
onChange: newFormSetter;
};
type ExistingFormProps = {
type: "existing";
value: ExistingFormValue;
onChange: existingFormSetter;
};
type FormProps = NewFormProps | ExistingFormProps;
const MyComponent: React.FC<FormProps> = (formProps) => {
return (
<>
<input
value={formProps.value.name}
onChange={({ target: { value: input } }) => {
// Doesn't work
formProps.onChange((prev) => ({ ...prev, name: input }));
// Works
switch (formProps.type) {
case "existing":
formProps.onChange((prev) => ({ ...prev, name: input }));
break;
case "new":
formProps.onChange((prev) => ({ ...prev, name: input }));
break;
}
}}
/>
{formProps.type === "new" && (
<input
value={formProps.value.email}
onChange={({ target: { value: input } }) => {
formProps.onChange((prev) => ({ ...prev, email: input }));
}}
/>
)}
</>
);
};
If I don't surround formProps.onChange call with an if/switch statement I get the error:
Parameter 'prev' implicitly has an 'any' type.
even if the switch does the same thing in both cases.
=================================================================================================================================