NeonCop
NeonCop
DTDrizzle Team
Created by NeonCop on 11/28/2024 in #help
Types on conditional joins
Hey everyone! I'm struggling with maintaining type safety when adding conditional joins in Drizzle. I have a function that builds a query with conditional joins based on parameters. Depending on the parameters, I might need to join different tables. However, TypeScript isn't correctly inferring the return type, and I have to cast it, which defeats the purpose of type safety. Here's a simplified version of my code: type JoinOptions = Partial<Record<'withFoo' | 'withBar', true>>; type BaseFields = ReturnType<typeof getTableColumnAliases<typeof baseTable>>; type FooFields = ReturnType<typeof getTableColumnAliases<typeof fooTable>>; type BarFields = ReturnType<typeof getTableColumnAliases<typeof barTable>>; type MyQuerySelection<T extends JoinOptions> = { base: BaseFields; } & (T['withFoo'] extends true ? { foo: FooFields } : {}) & (T['withBar'] extends true ? { bar: BarFields } : {}); export function buildMyQuery<T extends JoinOptions>({ params, joins = {} as T, }: { params: MyQueryParams; joins?: T; }) { const selectClauses = { base: getTableColumnAliases(baseTable), ...(joins.withFoo && { foo: getTableColumnAliases(fooTable) }), ...(joins.withBar && { bar: getTableColumnAliases(barTable) }), }; let query = db.select(selectClauses).from(baseTable).$dynamic(); if (joins.withFoo) { query = withFoo({ query, params }); } if (joins.withBar) { query = withBar({ query, params }); } return query; } But even with conditional types, TypeScript doesn't infer the return type based on joins. I have to cast the return type, which isn't ideal. Here's how I'm using the function: const query = buildMyQuery({ params: myParams, joins: { withFoo: true }, }); const results = await query.execute(); results.forEach((row) => { console.log(row.foo?.someField); // Error: Property 'foo' does not exist }); Has anyone faced this issue or have suggestions? Thanks in advance!
27 replies
DTDrizzle Team
Created by NeonCop on 3/28/2023 in #help
uuid's being inferred as strings
When I use InferModel on a table that has a uuid type, I see that the column gets inferred as a string instead of as a uuid type. Seems like the migrations are correctly using the native postgres uuid type, so confused why it's not being returned as a UUID
4 replies