Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add .$narrowType @ SelectQueryBuilder, InsertQueryBuilder, UpdateQueryBuilder & DeleteQueryBuilder. #380

Merged
merged 16 commits into from
Apr 9, 2023

Conversation

igalklebanov
Copy link
Member

@igalklebanov igalklebanov commented Mar 24, 2023

relevant to #335, #310.

Adds .$narrowType<T>() to select/insert/update/delete query builders.

This utility method narrows (parts of) the output type of the query.

Kysely tries to be as type-safe as possible, but in some cases we have to make compromises for better maintainability and compilation performance. At present, Kysely doesn't narrow the output type of the query when using .where, .having, etc.

This utility method is very useful for these situations, as it removes unncessary runtime assertion/guard code. Its input type is limited to the output type of the query, so you can't add a column that doesn't exist, or change a column's type to something that doesn't exist in its union type.

Turn this code:

const person = await db.selectFrom('person')
  .where('nullable_column', 'is not', null)
  .selectAll()
  .executeTakeFirstOrThrow()

if (person.nullable_column) {
  functionThatExpectsPersonWithNonNullValue(person)
}

Into this:

const person = await db.selectFrom('person')
  .where('nullable_column', 'is not', null)
  .selectAll()
  .$narrowType<{ nullable_column: string }>()
  .executeTakeFirstOrThrow()

functionThatExpectsPersonWithNonNullValue(person)

@igalklebanov igalklebanov added enhancement New feature or request api Related to library's API typescript Related to Typescript labels Mar 24, 2023
@igalklebanov igalklebanov changed the title add .$narrowTo. add .$narrowType. Mar 24, 2023
@igalklebanov igalklebanov marked this pull request as ready for review March 24, 2023 21:01
@igalklebanov igalklebanov changed the title add .$narrowType. add .$narrowType @ SelectQueryBuilder, InsertQueryBuilder, UpdateQueryBuilder & DeleteQueryBuilder. Mar 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api Related to library's API enhancement New feature or request typescript Related to Typescript
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants