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

[types] Make Knex's default generic parameter types be assignable to knex's (TypeScript 4.6) #5021

Merged
merged 1 commit into from Mar 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 12 additions & 0 deletions test-tsd/types.test-d.ts
Expand Up @@ -19,6 +19,18 @@ expectType<Knex<any, unknown[]>>(knexCjsImport.knex({}));
expectType<KnexTimeoutError>(new knex.KnexTimeoutError());
expectType<KnexTimeoutError>(new knex.KnexTimeoutError());

// Knex instances need to be assigned first so their generic types aren't inferred
const k1 = knex({});
expectAssignable<Knex>(k1);
const k2 = knexStar.default({});
expectAssignable<Knex>(k2);
const k3 = knexStar.knex({});
expectAssignable<Knex>(k3);
const k4 = knexCjsImport.default({});
expectAssignable<Knex>(k4);
const k5 = knexCjsImport.knex({});
expectAssignable<Knex>(k5);

// eslint-disable-next-line
expectType<any>(knexCjs({}));
// eslint-disable-next-line
Expand Down
2 changes: 1 addition & 1 deletion types/index.d.ts
Expand Up @@ -328,7 +328,7 @@ interface DMLOptions {
includeTriggerModifications?: boolean;
}

export interface Knex<TRecord extends {} = any, TResult = Record<string, any>[]>
export interface Knex<TRecord extends {} = any, TResult = any[]>
extends Knex.QueryInterface<TRecord, TResult>, events.EventEmitter {
<TTable extends Knex.TableNames>(
tableName: TTable,
Expand Down
3 changes: 3 additions & 0 deletions types/test.ts
Expand Up @@ -82,6 +82,9 @@ type _T8 = ExtendsWitness<Knex.QueryBuilder<User, number[]>, Knex.QueryBuilder>;
type _T9 = ExtendsWitness<Knex.QueryBuilder<any, any[]>, Knex.QueryBuilder>;
type _T10 = ExtendsWitness<Knex.QueryBuilder<User, number>, Knex.QueryBuilder>;

// Ensure the return type of knex() is compatible with Knex with default parameters
type _T2_1 = ExtendsWitness<typeof knexInstance, Knex>;

declare module './tables' {
interface Tables {
users_inferred: User;
Expand Down