Skip to content

Commit

Permalink
Fix Typescript type inference for to better support wildcard (*) calls
Browse files Browse the repository at this point in the history
  • Loading branch information
lorefnon authored and kibertoad committed Sep 22, 2019
1 parent 68e1ae2 commit b744564
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 1 deletion.
16 changes: 15 additions & 1 deletion types/index.d.ts
Expand Up @@ -548,6 +548,10 @@ declare namespace Knex {
): QueryBuilder<TRecord, TRecord[K][]>;
pluck<TResult2 extends {}>(column: string): QueryBuilder<TRecord, TResult2>;

insert(
data: MaybeArray<SafePartial<TRecord>>,
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
insert<
TKey extends StrKey<TRecord>,
TResult2 = DeferredIndex.Augment<
Expand Down Expand Up @@ -601,6 +605,10 @@ declare namespace Knex {
...args: any[]
): QueryBuilder<TRecord2, TResult2>;

update(
data: MaybeArray<SafePartial<TRecord>>,
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
update<
TKey extends StrKey<TRecord>,
TResult2 = DeferredIndex.Augment<
Expand Down Expand Up @@ -685,6 +693,7 @@ declare namespace Knex {
): QueryBuilder<TRecord, TResult2>;
update<TResult2 = number>(columnName: string, value: Value): QueryBuilder<TRecord, TResult2>;

returning(column: '*'): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
returning<
TKey extends StrKey<TRecord>,
TResult2 = DeferredIndex.Augment<
Expand All @@ -708,6 +717,9 @@ declare namespace Knex {
column: string | string[]
): QueryBuilder<TRecord, TResult2>;

del(
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
del<
TKey extends StrKey<TRecord>,
TResult2 = DeferredIndex.Augment<
Expand All @@ -733,6 +745,9 @@ declare namespace Knex {
): QueryBuilder<TRecord, TResult2>;
del<TResult2 = number>(): QueryBuilder<TRecord, TResult2>;

delete(
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
delete<
TKey extends StrKey<TRecord>,
TResult2 = DeferredIndex.Augment<
Expand Down Expand Up @@ -1340,7 +1355,6 @@ declare namespace Knex {
>
extends QueryInterface<TRecord, TResult>,
ChainableInterface<ResolveResult<TResult>> {

or: QueryBuilder<TRecord, TResult>;
not: QueryBuilder<TRecord, TResult>;
and: QueryBuilder<TRecord, TResult>;
Expand Down
100 changes: 100 additions & 0 deletions types/test.ts
Expand Up @@ -898,6 +898,9 @@ const main = async () => {
// $ExpectType number[]
await knex<User>('users').insert({ id: 10 }, 'id');

// $ExpectType User[]
await knex<User>('users').insert({ id: 10 }, '*');

// $ExpectType number[]
await knex.insert({ id: 10 }, 'id').into<User>('users');

Expand All @@ -911,6 +914,39 @@ const main = async () => {
.insert({ id: 10 }, 'id')
.returning(['id', 'age']);

// $ExpectType any[]
await knex('users')
.insert({id: 10})
.returning('*');

// $ExpectType User[]
await knex<User>('users')
.insert({id: 10})
.returning('*');

// $ExpectType any[]
await knex
.insert({id: 10})
.into('users')
.returning('*');

// $ExpectType User[]
await knex
.insert({id: 10})
.into<User>('users')
.returning('*');

// $ExpectType User[]
await knex
.insert({id: 10})
.returning('*')
.into<User>('users');

// $ExpectType User[]
await knex<User>('users')
.insert({id: 10}, 'id')
.returning('*');

// $ExpectType Pick<User, "id" | "age">[]
await knex
.insert({ id: 10 })
Expand Down Expand Up @@ -953,6 +989,32 @@ const main = async () => {
.update({ active: true })
.returning(['id', 'age']);

// $ExpectType any[]
await knex('users')
.where('id', 10)
.update({ active: true })
.returning('*');

// $ExpectType User[]
await knex<User>('users')
.where('id', 10)
.update({ active: true })
.returning('*');

// $ExpectType any[]
await knex
.where('id', 10)
.update({ active: true })
.returning('*')
.from('users');

// $ExpectType User[]
await knex
.where('id', 10)
.update({ active: true })
.returning('*')
.from<User>('users');

// $ExpectType Pick<User, "id" | "age">[]
await knex<User>('users')
.where('id', 10)
Expand Down Expand Up @@ -992,6 +1054,44 @@ const main = async () => {
.where('id', 10)
.delete('id');

// $ExpectType any[]
await knex('users')
.where('id', 10)
.del()
.returning('*');

// $ExpectType any[]
await knex('users')
.where('id', 10)
.delete()
.returning('*');

// $ExpectType User[]
await knex<User>('users')
.where('id', 10)
.del()
.returning('*');

// $ExpectType User[]
await knex<User>('users')
.where('id', 10)
.delete()
.returning('*');

// $ExpectType User[]
await knex
.where('id', 10)
.del()
.returning('*')
.from<User>('users');

// $ExpectType User[]
await knex
.where('id', 10)
.delete()
.returning('*')
.from<User>('users');

// $ExpectType number[]
await knex
.where('id', 10)
Expand Down

0 comments on commit b744564

Please sign in to comment.