zod: TypeError: Not assignable to parameter of type ZodType

I’ve created this schema to use in React Hook Form, but I’m getting an error that I’m not sure how to fix.

import { z } from 'zod';

export const schema = z.object({
  email_domains: z.string().min(1, { message: 'At least one domain is required' }),
  add_to_groups: z.string(),
  expires_at: z.string(),
  language: z.string(),
  name: z.string().min(1),
});

export type FormValuesType = z.infer<typeof schema>;
import { zodResolver } from '@hookform/resolvers/zod';
import { FormProvider, useForm } from 'react-hook-form';

import { defaultExpiresAt, defaultName } from '@/lib/invite-links';

import {
  FormValuesType,
  schema,
} from '@/components/InviteLinkCreatePage/schema';

export default function Form() {
  const methods = useForm<FormValuesType>({
    resolver: zodResolver(schema),
    values: {
      email_domains: '',
      add_to_groups: '',
      expires_at: defaultExpiresAt(),
      language: '',
      name: defaultName(),
    },
  });

  const handleSubmit = (data: FormValuesType) => {
    console.log({ data });
  };

  return (
    <FormProvider {...methods}>
      ...
    </FormProvider>
  );
}

The error coming back is:

Argument of type 'ZodObject<{ email_domains: ZodString; add_to_groups: ZodString; expires_at: ZodString; language: ZodString; name: ZodString; }, "strip", ZodTypeAny, { ...; }, { ...; }>' is not assignable to parameter of type 'ZodType<any, any, any>'.
  The types of 'refine(...)._def.typeName' are incompatible between these types.
    Type 'import("/Users/ernstoarllano/Sites/dispel/packages/cweb/node_modules/zod/lib/types").ZodFirstPartyTypeKind.ZodEffects' is not assignable to type 'Zod.ZodFirstPartyTypeKind.ZodEffects'.
      Property 'ZodReadonly' is missing in type 'Zod.ZodFirstPartyTypeKind'.

About this issue

  • Original URL
  • State: open
  • Created 10 months ago
  • Reactions: 41
  • Comments: 35

Commits related to this issue

Most upvoted comments

@ernstoarllano Are you using a monorepo by chance? If so, are the versions for zod in all of your package.jsons the same?

This worked for me remove node_modules

pnpm store prune
pnpm install

Thanks! I needed zod as a dependency so I just downgraded it to v3.21.4. I think that v3.22.0 and later are not compatible with some dependent libraries (like @hookform/resolvers) due to ZodReadonly.

I think a solution for zod@3.22.1 was just patched yesterday in react-hook-form/resolvers. https://github.com/react-hook-form/resolvers/commit/e5e73466e0f2e098c022ef9c373d5fa82cea7306#diff-7ae45ad102eab3b6d7e7896acd08c427a9b25b346470d7bc6507b6481575d519L257-R256

It has not been pushed to npm yet.

The maintainer just released it. But I can confirm it does not fix the issue 😦 Same issue with zod@3.22.2 and @hookform/resolvers@3.3.0

3.22.4 not working for me as well

zod@3.21.4 and @hookform/resolvers: ^3.3.0 worked for me

zod@3.21.4 worked for me

In my case this is my code

const FormSchema = z.object({
firstname: z.string({
  required_error: "Nombre es requerido",
}).min(3, {
  message: "Nombre debe tener al menos 3 letras",
}),
lastname: z.string({
  required_error: "Apellidos son requeridos",
}).min(3, {
  message: "Nombre debe tener al menos 3 letras",
}),
cc: z.coerce.number({
  required_error: "Documento es requerido",
  invalid_type_error: "El documento debe ser numérico",
}).int().gte(10000000, {
  message: "Cedula debe tener al menos 8 digitos",
}).lte(9999999999, {
  message: "Cedula no puede tener más de 10 digitos",
}),
phone: z.coerce.number({
  required_error: "Teléfono requerido",
  invalid_type_error: "El teléfono debe ser numérico",
}).int().gte(3000000000).lte(3299999999),
contactPhone: z.coerce.number({
  required_error: "Teléfono requerido",
  invalid_type_error: "El teléfono debe ser numérico",
}).int().gte(3000000000).lte(3299999999),
contactName: z.string({
  required_error: "Nombre contacto es requerido",
}).min(3, {
  message: "Nombre debe tener al menos 3 letras",
}),
rh: z.string({
  required_error: "Por favor seleccione un grupo sanguíneo",
}).min(2).max(3),
birthdate: z.date({
  required_error: "Fecha de nacimiento es requerida",
}),
bio: z
  .string()
  .min(10, {
    message: "Información debe tener al menos 10 carácteres",
  })
  .max(160, {
    message: "Información no debe tener más de 160 carácteres",
  }),
eps: z.string({
  required_error: "Por favor seleccione una EPS",
}),
});

const form = useForm<z.infer<typeof FormSchema>>({
  resolver: zodResolver(FormSchema),
})

I’m working with Zod 3.22.4, but still have the issue

 Argument of type 'ZodObject<{ firstname: ZodString; lastname: ZodString; cc: ZodNumber; phone: ZodNumber; contactPhone: ZodNumber; contactName: ZodString; rh: ZodString; birthdate: ZodDate; bio: ZodString; eps: ZodString; }, "strip", ZodTypeAny, { ...; }, { ...; }>' is not assignable to parameter of type 'ZodType<any, any, any>'.
 The types of 'refine(...)._def.typeName' are incompatible between these types.
   Type 'import("C:/Users/hemag/OneDrive/Documents/GitHub/volt-riders/node_modules/.pnpm/zod@3.22.4/node_modules/zod/lib/types").ZodFirstPartyTypeKind.ZodEffects' is not assignable to type 'Zod.ZodFirstPartyTypeKind.ZodEffects'.
     Property 'ZodReadonly' is missing in type 'Zod.ZodFirstPartyTypeKind'.ts(2345)

This worked for me remove node_modules

pnpm store prune
pnpm install

This worked for me but wasn’t immediately apparent; I had to Reload windows in VS Code.

zod@3.21.4 and @hookform/resolvers: ^3.3.0 worked for me

Same here

Same, but why is it broken on the latest version

"zod": "^3.21.4"
"@hookform/resolvers": "^3.3.1"

this is what worked here, after restarting vscode, thx

Same, but why is it broken on the latest version

workarround is downgrade to zod@3.21.4

thnks guys

I think a solution for zod@3.22.1 was just patched yesterday in react-hook-form/resolvers. https://github.com/react-hook-form/resolvers/commit/e5e73466e0f2e098c022ef9c373d5fa82cea7306#diff-7ae45ad102eab3b6d7e7896acd08c427a9b25b346470d7bc6507b6481575d519L257-R256

It has not been pushed to npm yet.

Updating to the latest zod 3.22.4 fixed it for me 👍

In case anyone else is being daft like me - I encountered this error in my monorepo (turborepo). I had forgotten to install zod to one of the places I was using it.

Zod v3.22.3 is out and I now get no linting errors 😊 Thanks!

I just remove the node modules and the lock file. That worked for me too

Developer Community Rocks 😃

npm install zod@3.21.4
"@hookform/resolvers": "^3.3.1"

zod@3.21.4 and @hookform/resolvers: ^3.3.0 worked for me

Same issue, currently using zod@3.22.2 and @hookform/resolvers: ^3.3.1

Same issue I am now using zod@3.21.4 and @hookform/resolvers: ^3.1.0 Upgrade, reload vscode and it will work

Downgrading to 3.21.4 works for me, 3.22.4 does not.

3.22.4 and rm -rf node_modules did not fix it for me.

Downgrade to 3.21.4 works.

EDIT: I had a library using 3.21.4 that was exposing a Zod type. Updating the library to 3.22.4 fixed it too. Can now use 3.22.4.

const passwordSchema = z.object({
  currentPassword: z.string(),
  newPassword: z.string().min(8),
  confirmNewPassword: z.string().min(8),
});
const validationSchema = toTypedSchema(passwordSchema);

I’ve upgraded to Zod 3.22.3 and it seems to have fixed the issue (or at least changed the error message). With the example above, I now get the message Type instantiation is excessively deep and possibly infinite.ts (2589)

Thanks! I needed zod as a dependency so I just downgraded it to v3.21.4. I think that v3.22.0 and later are not compatible with some dependent libraries (like @hookform/resolvers) due to ZodReadonly.

Thanks I got exactly the same error in v3.22.1 and v3.22.0 and downgrading to v3.21.4 resolved it