drizzle-team / drizzle-team/drizzle-orm

[BUG]: PgTable types don't work well when come from generics

Open
#4,367 11 comments 19 reactions 0 assignees View on GitHub
bug priority qb/crud
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.