From a3d4df1f902f476f9635b0a8379cfbfe913dee1f Mon Sep 17 00:00:00 2001 From: James Ide Date: Fri, 11 Feb 2022 17:31:30 -0800 Subject: [PATCH] [types] Make Knex's default generic parameter types be assignable to knex's The default generic parameters of `Knex` didn't match the generic parameter types of `knex`. This becomes relevant with TypeScript 4.6 for `k: Knex = knex()` to work. We can't change `knex`'s declaration from `TResult = unknown[]` to `TResult = Record[]` because other types like `DeferredKeySelection.ReplaceBase` specifically look for `unknown`. Instead, this commit changes `Knex` to use `TResult = any[]`. This works with TypeScript 4.6. Added both tsd and dtslint tests (tsd doesn't support TS 4.6 yet). Also tested this change in a larger codebase and confirmed that nearly all TS 4.6 errors were addressed. --- test-tsd/types.test-d.ts | 12 ++++++++++++ types/index.d.ts | 2 +- types/test.ts | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/test-tsd/types.test-d.ts b/test-tsd/types.test-d.ts index 0732e6ffbd..6e639c6d08 100644 --- a/test-tsd/types.test-d.ts +++ b/test-tsd/types.test-d.ts @@ -19,6 +19,18 @@ expectType>(knexCjsImport.knex({})); expectType(new knex.KnexTimeoutError()); expectType(new knex.KnexTimeoutError()); +// Knex instances need to be assigned first so their generic types aren't inferred +const k1 = knex({}); +expectAssignable(k1); +const k2 = knexStar.default({}); +expectAssignable(k2); +const k3 = knexStar.knex({}); +expectAssignable(k3); +const k4 = knexCjsImport.default({}); +expectAssignable(k4); +const k5 = knexCjsImport.knex({}); +expectAssignable(k5); + // eslint-disable-next-line expectType(knexCjs({})); // eslint-disable-next-line diff --git a/types/index.d.ts b/types/index.d.ts index daccda0ccf..c4a8d8e02a 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -328,7 +328,7 @@ interface DMLOptions { includeTriggerModifications?: boolean; } -export interface Knex[]> +export interface Knex extends Knex.QueryInterface, events.EventEmitter { ( tableName: TTable, diff --git a/types/test.ts b/types/test.ts index 9b086b9e03..553c8589c8 100644 --- a/types/test.ts +++ b/types/test.ts @@ -82,6 +82,9 @@ type _T8 = ExtendsWitness, Knex.QueryBuilder>; type _T9 = ExtendsWitness, Knex.QueryBuilder>; type _T10 = ExtendsWitness, Knex.QueryBuilder>; +// Ensure the return type of knex() is compatible with Knex with default parameters +type _T2_1 = ExtendsWitness; + declare module './tables' { interface Tables { users_inferred: User;