[BUG]:drizzle-zod produces wrong type
What version of drizzle-orm are you using?
0.28.5
What version of drizzle-kit are you using?
0.19.13
Describe the Bug
I'm using drizzle-orm, drizzle-kit & drizzle-zod in my application. One of my schema looks like following:
export const committee = pgTable("committee", {
id: text("id").primaryKey().notNull(),
safety_health: text("safety_health"),
safety_health_sources: text(
"safety_health_sources"
).array(),
// other properties
}
The schema works fine when I push, safety_health_sources is created as an array (No issues till this point)
I create zod schema as well, like following:
export const committeeSchema = createSelectSchema(committee);
and when I do:
type Committee = Partial<
z.infer<typeof committeeSchema>
>;
// the type become something like following
type Committee = {
id?: string | undefined;
safety_health?: string | null | undefined;
safety_health_sources?: string | null | undefined; // <--- The problem is here, it should be an Array<string>
// other properties
}
Expected behavior
The type should be something like:
type Committee = {
id?: string | undefined;
safety_health?: string | null | undefined;
safety_health_sources?: string[] | null | undefined; // <--- This
// other properties
}
Environment & setup
NodeJS: v20.5.0
npm: 9.8.0
OS: EndeavourOS Linux x86_64
I ran into this as well. This fixes it for now
export const selectDataSchema = createSelectSchema(
responseData,
{
text_array: z.array(z.string()),
},
)
The following produces correct types (It's strange):
type Committee = Partial<InferInsertModel<typeof committee>>;
The type it produces:
type Committee = {
safety_health?: string | null | undefined;
safety_health_sources?: string[] | null | undefined; // <--- it works, it produces string[]
// other properties
}
Ran into this exact problem and have a quick replication example here.
Likely related to https://github.com/drizzle-team/drizzle-orm/issues/1345 as well
This is showing up in drizzle-typebox too. Array fields in PostgreSQL is also not converting to Array type correct when calling createSelectSchema. Fortunately, drizzle-typebox have options for manual override.
@dankochetov any updates on this issue 😃
Just wanted to drop a comment here to say that we ran into this problem in our team as well. In our case we had a column which was an array of an enum, and the solutions above weren't perfect for us as we've have to type out the enum again in two places.
We ended up resorting to a cast:
createSelectSchema(someTable, {
someField: (_) => _.someField as unknown as ZodArray<typeof _.someField, "many">,
});
This works because curiously and correctly the runtime value is actually a ZodArray already, it's only the type that isn't.
Running into this too -- having drizzle-zod work on arrays is crucial functionality! Hoping this gets fixed soon :)
The thing I just noticed is that it works properly but the types are off. Took we a while of breaking the schema to realise that
Also running into this issue.
Possibly duplicated by https://github.com/drizzle-team/drizzle-orm/issues/1609.
Heads-up drizzle team, there may be a workaround for this, but it's an issue with one of the fundamental value propositions of the library.
Seems like there's a PR for this that hasn't been reviewed yet.
This one should be fixed in the latest [email protected]