How to implement a typesafe exists method in Kysely?

242 Views Asked by At

I manage to create a create method but stuck on exists. create is like this

import { InsertObject, SelectType } from "kysely";
import { db } from "./dataSource";
import { DB } from "app/src/dbTypes"

// type of table
type TE = keyof DB & string

// type of object to insert
type Insertable<T extends TE> = InsertObject<DB, T>;

export class BaseRepo {
  static async create
    <T extends TE, I extends Insertable<T>>
    (item: I, table: T): Promise<SelectType<DB[T]["id"]> | undefined> 
  {
    const result = await db()
      .insertInto(table)
      .values(item)
      .returning('id')
      .executeTakeFirst()

    return result?.id
  }
}
 

My attempt to create exists is like this

  static async exists<T extends TE>(table: T, column: ReferenceExpression<DB, T>, value: any) {
    const result = await db()
      .selectFrom(table)
      .select(eb => eb.fn.countAll<number>().as('num'))
      .where(column, '=', value)
      .limit(1)
      .executeTakeFirstOrThrow()

    return result.num > 0
  }

problem is I cannot find the correct type for column. Error is like this;

Argument of type 'ReferenceExpression<DB, T>' is not assignable to parameter of type 'ReferenceExpression<DB, ExtractTableAlias<DB, T>>'.
  Type 'AnyColumnWithTable<DB, T>' is not assignable to type 'ReferenceExpression<DB, ExtractTableAlias<DB, T>>'.
    Type '`auth.users.${string}`' is not assignable to type 'ReferenceExpression<DB, ExtractTableAlias<DB, T>>'.ts(2345)
(parameter) column: ReferenceExpression<DB, T>

How can I implement this method correctly?

0

There are 0 best solutions below