From 47e9cf6d8947e46a82bb09bbcc3dd74a3ac0ffa1 Mon Sep 17 00:00:00 2001 From: Ravi van Rooijen Date: Wed, 4 Sep 2019 19:44:34 +0200 Subject: [PATCH] [@types/pg] Generify query methods (#37892) * [@types/pg] Generify query methods `R` will be the return type of the query, `I` a tuple for parameters * [@types/pg] Add test for generified query method * Raise pg-copy-streams minimum typescript version for pg compatibility * Raise pg-ears minimum typescript version for pg compatibility * Raise pg-large-object minimum typescript version for pg compatibility * Raise pg-pool minimum typescript version for pg compatibility * Raise pg-query minimum typescript version for pg compatibility --- types/pg-copy-streams/index.d.ts | 1 + types/pg-ears/index.d.ts | 1 + types/pg-large-object/index.d.ts | 2 +- types/pg-pool/index.d.ts | 1 + types/pg-query-stream/index.d.ts | 1 + types/pg/index.d.ts | 61 ++++++++++++++++++-------------- types/pg/pg-tests.ts | 10 ++++++ 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/types/pg-copy-streams/index.d.ts b/types/pg-copy-streams/index.d.ts index 4f468d5639..9ffbdaa688 100644 --- a/types/pg-copy-streams/index.d.ts +++ b/types/pg-copy-streams/index.d.ts @@ -2,6 +2,7 @@ // Project: https://github.com/brianc/node-pg-copy-streams // Definitions by: Brian Crowell // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 /// diff --git a/types/pg-ears/index.d.ts b/types/pg-ears/index.d.ts index d3fdaadf89..bd56ac9566 100644 --- a/types/pg-ears/index.d.ts +++ b/types/pg-ears/index.d.ts @@ -2,6 +2,7 @@ // Project: https://github.com/doesdev/pg-ears // Definitions by: Bradley Ayers // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 import { ClientConfig } from "pg"; diff --git a/types/pg-large-object/index.d.ts b/types/pg-large-object/index.d.ts index 64a450d545..8dff9c66a3 100644 --- a/types/pg-large-object/index.d.ts +++ b/types/pg-large-object/index.d.ts @@ -2,7 +2,7 @@ // Project: https://github.com/Joris-van-der-Wel/node-pg-large-object#readme // Definitions by: Mateusz Krupa // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.2 +// TypeScript Version: 2.3 /// diff --git a/types/pg-pool/index.d.ts b/types/pg-pool/index.d.ts index ab35a4ed83..e84dd74bb1 100644 --- a/types/pg-pool/index.d.ts +++ b/types/pg-pool/index.d.ts @@ -2,6 +2,7 @@ // Project: https://github.com/brianc/node-pg-pool // Definitions by: Leo Liang , Nikita Tokarchuk // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 import * as pg from 'pg'; diff --git a/types/pg-query-stream/index.d.ts b/types/pg-query-stream/index.d.ts index ce1efedf5a..caa810a78f 100644 --- a/types/pg-query-stream/index.d.ts +++ b/types/pg-query-stream/index.d.ts @@ -2,6 +2,7 @@ // Project: https://github.com/brianc/node-pg-query-stream // Definitions by: António Marques // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 /// diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index 54fe0df068..033eee6b72 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -1,7 +1,8 @@ // Type definitions for pg 7.11 // Project: http://github.com/brianc/node-postgres -// Definitions by: Phips Peter +// Definitions by: Phips Peter , Ravi van Rooijen // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 /// @@ -48,17 +49,17 @@ export interface PoolConfig extends ClientConfig { Promise?: PromiseConstructorLike; } -export interface QueryConfig { +export interface QueryConfig { name?: string; text: string; - values?: any[]; + values?: I; } export interface Submittable { submit: (connection: Connection) => void; } -export interface QueryArrayConfig extends QueryConfig { +export interface QueryArrayConfig extends QueryConfig { rowMode: 'array'; } @@ -79,12 +80,16 @@ export interface QueryResultBase { fields: FieldDef[]; } -export interface QueryResult extends QueryResultBase { - rows: any[]; +export interface QueryResultRow { + [column: string]: any; } -export interface QueryArrayResult extends QueryResultBase { - rows: any[][]; +export interface QueryResult extends QueryResultBase { + rows: R[]; +} + +export interface QueryArrayResult extends QueryResultBase { + rows: R[]; } export interface Notification { @@ -93,8 +98,8 @@ export interface Notification { payload?: string; } -export interface ResultBuilder extends QueryResult { - addRow(row: any): void; +export interface ResultBuilder extends QueryResult { + addRow(row: R): void; } export interface QueryParse { @@ -156,12 +161,14 @@ export class Pool extends events.EventEmitter { end(callback: () => void): void; query(queryStream: T): T; - query(queryConfig: QueryArrayConfig, values?: any[]): Promise; - query(queryConfig: QueryConfig): Promise; - query(queryTextOrConfig: string | QueryConfig, values?: any[]): Promise; - query(queryConfig: QueryArrayConfig, callback: (err: Error, result: QueryArrayResult) => void): void; - query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): void; - query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): void; + // tslint:disable:no-unnecessary-generics + query(queryConfig: QueryArrayConfig, values?: I): Promise>; + query(queryConfig: QueryConfig): Promise>; + query(queryTextOrConfig: string | QueryConfig, values?: I): Promise>; + query(queryConfig: QueryArrayConfig, callback: (err: Error, result: QueryArrayResult) => void): void; + query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): void; + query(queryText: string, values: I, callback: (err: Error, result: QueryResult) => void): void; + // tslint:enable:no-unnecessary-generics on(event: "error", listener: (err: Error, client: PoolClient) => void): this; on(event: "connect" | "acquire" | "remove", listener: (client: PoolClient) => void): this; @@ -174,12 +181,14 @@ export class ClientBase extends events.EventEmitter { connect(callback: (err: Error) => void): void; query(queryStream: T): T; - query(queryConfig: QueryArrayConfig, values?: any[]): Promise; - query(queryConfig: QueryConfig): Promise; - query(queryTextOrConfig: string | QueryConfig, values?: any[]): Promise; - query(queryConfig: QueryArrayConfig, callback: (err: Error, result: QueryArrayResult) => void): void; - query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): void; - query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): void; + // tslint:disable:no-unnecessary-generics + query(queryConfig: QueryArrayConfig, values?: I): Promise>; + query(queryConfig: QueryConfig): Promise>; + query(queryTextOrConfig: string | QueryConfig, values?: I): Promise>; + query(queryConfig: QueryArrayConfig, callback: (err: Error, result: QueryArrayResult) => void): void; + query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): void; + query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): void; + // tslint:enable:no-unnecessary-generics copyFrom(queryText: string): stream.Writable; copyTo(queryText: string): stream.Readable; @@ -208,12 +217,12 @@ export interface PoolClient extends ClientBase { release(err?: Error): void; } -export class Query extends events.EventEmitter implements Submittable { - constructor(queryTextOrConfig?: string | QueryConfig, values?: any[]); +export class Query extends events.EventEmitter implements Submittable { + constructor(queryTextOrConfig?: string | QueryConfig, values?: I); submit: (connection: Connection) => void; - on(event: "row", listener: (row: any, result?: ResultBuilder) => void): this; + on(event: "row", listener: (row: R, result?: ResultBuilder) => void): this; on(event: "error", listener: (err: Error) => void): this; - on(event: "end", listener: (result: ResultBuilder) => void): this; + on(event: "end", listener: (result: ResultBuilder) => void): this; } export class Events extends events.EventEmitter { diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index 5051447667..e193740d4b 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -46,6 +46,16 @@ client.query('SELECT $1::text as name', ['brianc'], (err, res) => { client.end(); }); +interface Person { + name: string; +} + +client.query('SELECT $1::text as name', ['brianc'], (err, res) => { + if (err) throw err; + console.log(res.rows[0].name); + client.end(); +}); + const query = { name: 'get-name', text: 'SELECT $1::text',