2019-05-04 14:04:07 +05:30
|
|
|
import * as Knex from 'knex';
|
|
|
|
|
|
|
|
const knex = Knex({
|
|
|
|
client: 'sqlite3',
|
|
|
|
connection: {
|
|
|
|
filename: './mydb.sqlite',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
interface User {
|
|
|
|
id: number;
|
|
|
|
age: number;
|
|
|
|
name: string;
|
|
|
|
active: boolean;
|
|
|
|
departmentId: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface Department {
|
|
|
|
id: number;
|
|
|
|
departmentName: string;
|
|
|
|
}
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// Interface to witness type compatibility
|
|
|
|
interface ExtendsWitness<T1 extends T2, T2> {
|
|
|
|
_t: T1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure that Knex type with parameters is compatible with Knex with default parameters
|
|
|
|
//
|
|
|
|
// This ensures that a value of Parameterized Knex can always be passed to a function that
|
|
|
|
// consumes unparameterized Knex.
|
|
|
|
type _T1 = ExtendsWitness<Knex<User>, Knex>;
|
|
|
|
type _T2 = ExtendsWitness<Knex<User, Partial<User>[]>, Knex>;
|
|
|
|
type _T3 = ExtendsWitness<Knex.Where<User, Partial<User>[]>, Knex.Where>;
|
|
|
|
type _T4 = ExtendsWitness<Knex.Where<User, number>, Knex.Where>;
|
|
|
|
type _T5 = ExtendsWitness<
|
|
|
|
Knex.QueryInterface<User, Partial<User[]>>,
|
|
|
|
Knex.QueryInterface
|
|
|
|
>;
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
const main = async () => {
|
2019-05-17 01:55:37 +05:30
|
|
|
// # Select:
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users');
|
|
|
|
|
|
|
|
// $ExpectType User[]
|
|
|
|
await knex<User>('users');
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users').select('id');
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users').select('id').select('age');
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users').select('users.id');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id">[]
|
|
|
|
await knex<User>('users').select('id');
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users').select('id').select('age');
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users').select('id', 'age');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users').select(['id', 'age']);
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
2019-05-04 14:04:07 +05:30
|
|
|
await knex<User>('users').select('users.id');
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex<User>('users').select('users.id').select('age');
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex<User>('users').select('id').from('departments');
|
|
|
|
|
|
|
|
// $ExpectType Pick<Department, "id">[]
|
|
|
|
await knex<User>('users').select('id').from<Department>('departments');
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex.select('id').from('users');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id">[]
|
|
|
|
await knex.select('id').from<User>('users');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex.select('id', 'age').from<User>('users');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id">[]
|
|
|
|
await knex.from<User>('users').select('id');
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
2019-05-04 14:04:07 +05:30
|
|
|
await knex.from<User>('users').select('users.id');
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex.column('id', 'age').select().from('users');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex.column('id', 'age').select().from<User>('users');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users').column('id', 'age').select();
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users').column('id', 'age');
|
|
|
|
|
|
|
|
const r1 = await knex.column('id', {yearsSinceBirth: 'age'}).select().from<User>('users');
|
|
|
|
type TR1_1 = ExtendsWitness<{id: number; yearsSinceBirth: any}, typeof r1[0]>;
|
|
|
|
type TR1_2 = ExtendsWitness<number, typeof r1[0]["id"]>;
|
|
|
|
type TR1_3 = ExtendsWitness<any, typeof r1[0]["yearsSinceBirth"]>;
|
|
|
|
|
|
|
|
const r2 = await knex.column('id', {yearsSinceBirth: 'age' as 'age'}).select().from<User>('users');
|
|
|
|
type TR2_1 = ExtendsWitness<{id: number; yearsSinceBirth: number}, typeof r2[0]>;
|
|
|
|
type TR2_2 = ExtendsWitness<number, typeof r1[0]["id"]>;
|
|
|
|
type TR2_3 = ExtendsWitness<number, typeof r1[0]["yearsSinceBirth"]>;
|
|
|
|
|
|
|
|
// ## Conditional Selection:
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType User[]
|
|
|
|
await knex<User>('users').where({ id: 10 });
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex.where({ id: 10 }).from('users');
|
|
|
|
|
|
|
|
// $ExpectType User[]
|
|
|
|
await knex.where({ id: 10 }).from<User>('users');
|
|
|
|
|
|
|
|
// $ExpectType User[]
|
|
|
|
await knex.where({ id: 10 }).where('age', '>', 20).from<User>('users');
|
|
|
|
|
|
|
|
// $ExpectType User[]
|
|
|
|
await knex<User>('users').whereNot('age', '>', 100);
|
|
|
|
|
|
|
|
// ## Aggregation:
|
2019-05-04 14:04:07 +05:30
|
|
|
|
|
|
|
// $ExpectType Partial<User>[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.groupBy('count')
|
|
|
|
.orderBy('name', 'desc')
|
|
|
|
.having('age', '>', 10);
|
|
|
|
|
|
|
|
// $ExpectType { [key: string]: string | number; }[]
|
|
|
|
await knex<User>('users').count();
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType ValueDict[]
|
|
|
|
await knex<User>('users').max('age');
|
|
|
|
|
|
|
|
// $ExpectType ValueDict[]
|
|
|
|
await knex('users').max('age');
|
|
|
|
|
|
|
|
// $ExpectType ValueDict[]
|
|
|
|
await knex<User>('users').min('age');
|
|
|
|
|
|
|
|
// $ExpectType { [key: string]: string | number; }[]
|
|
|
|
await knex<User>('users').count('age');
|
|
|
|
|
|
|
|
// $ExpectType { [key: string]: string | number; }[]
|
|
|
|
await knex('users').count('age');
|
|
|
|
|
|
|
|
// ## With inner query:
|
|
|
|
|
|
|
|
// ### For column selection:
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users').select(
|
|
|
|
knex('foo')
|
|
|
|
.select('bar')
|
|
|
|
.as('colName')
|
|
|
|
);
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex<User>('users').select(
|
|
|
|
knex('foo')
|
|
|
|
.select('bar')
|
|
|
|
.as('colName')
|
|
|
|
);
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "age" | "name">[]
|
|
|
|
await knex<User>('users').select<Pick<User, 'name' | 'age'>[]>(
|
|
|
|
knex('foo')
|
|
|
|
.select('bar')
|
|
|
|
.as('colName')
|
|
|
|
);
|
|
|
|
|
|
|
|
// ### For condition:
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users').whereNot(function() {
|
|
|
|
this.where('id', 1).orWhereNot('id', '>', 10);
|
|
|
|
});
|
|
|
|
|
|
|
|
// $ExpectType User[]
|
|
|
|
await knex<User>('users').whereNot(function() {
|
|
|
|
this.where('id', 1).orWhereNot('id', '>', 10);
|
|
|
|
});
|
|
|
|
|
|
|
|
// ## Joins:
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType (User & Department)[]
|
|
|
|
await knex<User>('users').innerJoin<Department>(
|
|
|
|
'departments',
|
|
|
|
'users.departmentid',
|
2019-05-17 01:55:37 +05:30
|
|
|
'departments.id'
|
2019-05-04 14:04:07 +05:30
|
|
|
);
|
|
|
|
|
|
|
|
// $ExpectType (User & Department)[]
|
|
|
|
await knex<User>('users').innerJoin<Department>(
|
|
|
|
'departments',
|
|
|
|
'users.departmentid',
|
|
|
|
'=',
|
2019-05-17 01:55:37 +05:30
|
|
|
'departments.id'
|
2019-05-04 14:04:07 +05:30
|
|
|
);
|
|
|
|
|
|
|
|
// $ExpectType (User & Department)[]
|
|
|
|
await knex<User>('users').innerJoin<Department>('departments', function() {
|
|
|
|
this.on('users.id', '=', 'departments.id');
|
|
|
|
});
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
2019-05-04 14:04:07 +05:30
|
|
|
await knex<User>('users')
|
|
|
|
.innerJoin<Department>(
|
|
|
|
'departments',
|
|
|
|
'users.departmentid',
|
2019-05-17 01:55:37 +05:30
|
|
|
'departments.id'
|
2019-05-04 14:04:07 +05:30
|
|
|
)
|
|
|
|
.select('users.id', 'departments.id');
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// # Insertion
|
|
|
|
|
|
|
|
// $ExpectType number
|
|
|
|
await knex('users').insert({ id: 10 });
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType number
|
|
|
|
await knex<User>('users').insert({ id: 10 });
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// ## With returning
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning('id');
|
|
|
|
|
|
|
|
// $ExpectType number[]
|
|
|
|
await knex('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning<number[]>('id');
|
|
|
|
|
|
|
|
// $ExpectType string[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning<string[]>('id');
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType number[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning('id');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning(['id', 'age']);
|
|
|
|
|
|
|
|
// $ExpectType number[]
|
|
|
|
await knex<User>('users').insert({ id: 10 }, 'id');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning(['id', 'age']);
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users')
|
|
|
|
.insert({ id: 10 })
|
|
|
|
.returning(['id', 'age']);
|
|
|
|
|
|
|
|
// # Update
|
|
|
|
|
|
|
|
// $ExpectType number
|
|
|
|
await knex('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.update({ active: true });
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType number
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.update({ active: true });
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// ## With Returning
|
|
|
|
|
|
|
|
// $ExpectType any[]
|
|
|
|
await knex('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.update({ active: true })
|
|
|
|
.returning(['id', 'age']);
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.update({ active: true })
|
|
|
|
.returning(['id', 'age']);
|
|
|
|
|
|
|
|
// $ExpectType number[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.update({ active: true }, 'id');
|
|
|
|
|
|
|
|
// $ExpectType Pick<User, "id" | "age">[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.update({ active: true }, ['id', 'age']);
|
|
|
|
|
2019-05-17 01:55:37 +05:30
|
|
|
// # Deletion
|
|
|
|
|
2019-05-04 14:04:07 +05:30
|
|
|
// $ExpectType number
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.delete();
|
|
|
|
|
|
|
|
// $ExpectType number
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.del();
|
|
|
|
|
|
|
|
// $ExpectType number[]
|
|
|
|
await knex<User>('users')
|
|
|
|
.where('id', 10)
|
|
|
|
.delete('id');
|
|
|
|
|
|
|
|
// $ExpectType void
|
|
|
|
await knex<User>('users').truncate();
|
|
|
|
|
|
|
|
// $ExpectType void
|
|
|
|
await knex('users').truncate();
|
|
|
|
};
|