kysely

    Interface AliasableExpression<T>

    An expression with an as method.

    interface AliasableExpression<T> {
        get expressionType(): undefined | T;
        as<A extends string>(alias: A): AliasedExpression<T, A>;
        as<A extends string>(alias: Expression<any>): AliasedExpression<T, A>;
        toOperationNode(): OperationNode;
    }

    Type Parameters

    • T

    Hierarchy (View Summary, Expand)

    Implemented by

    Index

    Accessors

    • get expressionType(): undefined | T

      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(): Tundefined {
      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>.

      Returns undefined | T

    Methods

    • Returns an aliased version of the expression.

      In addition to slapping as "the_alias" at the end of the expression, this method also provides strict typing:

      const result = await db
      .selectFrom('person')
      .select((eb) =>
      // `eb.fn<string>` returns an AliasableExpression<string>
      eb.fn<string>('concat', ['first_name', eb.val(' '), 'last_name']).as('full_name')
      )
      .executeTakeFirstOrThrow()

      // `full_name: string` field exists in the result type.
      console.log(result.full_name)

      The generated SQL (PostgreSQL):

      select
      concat("first_name", $1, "last_name") as "full_name"
      from
      "person"

      You can also pass in a raw SQL snippet (or any expression) but in that case you must provide the alias as the only type argument:

      import { sql } from 'kysely'

      const values = sql<{ a: number, b: string }>`(values (1, 'foo'))`

      // The alias is `t(a, b)` which specifies the column names
      // in addition to the table name. We must tell kysely that
      // columns of the table can be referenced through `t`
      // by providing an explicit type argument.
      const aliasedValues = values.as<'t'>(sql`t(a, b)`)

      await db
      .insertInto('person')
      .columns(['first_name', 'last_name'])
      .expression(
      db.selectFrom(aliasedValues).select(['t.a', 't.b'])
      )
      .execute()

      The generated SQL (PostgreSQL):

      insert into "person" ("first_name", "last_name")
      from (values (1, 'foo')) as t(a, b)
      select "t"."a", "t"."b"

      Type Parameters

      • A extends string

      Parameters

      • alias: A

      Returns AliasedExpression<T, A>

    • Type Parameters

      • A extends string

      Parameters

      Returns AliasedExpression<T, A>

    • 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()
      }
      }

      Returns OperationNode

    MMNEPVFCICPMFPCPTTAAATR