drizzle-team / drizzle-team/drizzle-orm
[BUG]: PgTable types don't work well when come from generics
- Dominant language
- TypeScript
- Stars
- 35.8k
- Forks
- 1.6k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 4
Description
### Report hasn't been filed before.
- [x] I have verified that the bug I'm about to report hasn't been filed before.
### What version of `drizzle-orm` are you using?
0.41.0
### What version of `drizzle-kit` are you using?
0.30.6
### Other packages
_No response_
### Describe the Bug
I'm trying to make an abstract shared repository (`BaseRepository`) for all of my tables, but Drizzle's types doesn't like it.
How to reproduce:
```ts
// db/index.ts
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/node-postgres';
export const db = drizzle(process.env.DATABASE_URL!);
```
```ts
// db/schema.ts
import { integer, pgTable, varchar } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: integer().primaryKey().generatedAlwaysAsIdentity(),
name: varchar({ length: 255 }).notNull(),
age: integer().notNull(),
email: varchar({ length: 255 }).notNull().unique(),
});
```
```ts
// base-repository.ts
import * as schema from "./schema";
import {db} from "./index";
export class BaseRepository {
constructor(private readonly table: Table) {}
async findAll() {
return await db.select().from(this.table);
// Error is here ^
}
}
```
This is the error:
```
Argument of type 'Table' is not assignable to parameter of type 'TableLikeHasEmptySelection extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : Table'.
Type 'PgTable<{ name: "users"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "users"; dataType: "number"; columnType: "PgInteger"; data: number; driverParam: string | number; notNull: true; ... 7 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; age: PgColumn<...>; email: PgColumn<...>...' is not assignable to type 'TableLikeHasEmptySelection extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : Table'.ts(2345)
```
Expected usage:
```ts
// user-repository.ts
import { BaseRepository } from "./base-repository";
import * as schema from "./schema";
export class UserRepository extends BaseRepository {
constructor() {
super(schema.users);
}
}
const userRepository = new UserRepository();
const users = await userRepository.findAll();
```
Contributor guide
Assessment
This issue has not been assessed yet.