All expressions need to have this getter for complicated type-related reasons.
Simply add this getter for your expression and always return undefined from it:
import { type Expression, type OperationNode, sql } from 'kysely'
class SomeExpression<T> implements Expression<T> {
  get expressionType(): T | undefined {
    return undefined
  }
  toOperationNode(): OperationNode {
    return sql`some sql here`.toOperationNode()
  }
}
The getter is needed to make the expression assignable to another expression only
if the types T are assignable. Without this property (or some other property
that references T), you could assing Expression<string> to Expression<number>.
Creates the OperationNode that describes how to compile this expression into SQL.
If you are creating a custom expression, it's often easiest to use the sql template tag to build the node:
import { type Expression, type OperationNode, sql } from 'kysely'
class SomeExpression<T> implements Expression<T> {
  get expressionType(): T | undefined {
    return undefined
  }
  toOperationNode(): OperationNode {
    return sql`some sql here`.toOperationNode()
  }
}
Expressionrepresents an arbitrary SQL expression with a type.Most Kysely methods accept instances of
Expressionand most classes likeSelectQueryBuilderand the return value of the sql template tag implement it.Examples
You can implement the
Expressioninterface to create your own type-safe utilities for Kysely.