Skip to content

Commit 28512bf

Browse files
authored
Add implicit custom type inference (porsager#361)
1 parent 6b749b2 commit 28512bf

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

types/index.d.ts

+15-15
Original file line numberDiff line numberDiff line change
@@ -159,23 +159,23 @@ type UnwrapPromiseArray<T> = T extends any[] ? {
159159

160160
type Keys = string
161161

162-
type SerializableObject<T, K extends readonly any[]> =
162+
type SerializableObject<T, K extends readonly any[], TT> =
163163
number extends K['length'] ? {} :
164-
(Record<Keys & (keyof T) & (K['length'] extends 0 ? string : K[number]), postgres.SerializableParameter | postgres.JSONValue> & Record<string, any>)
164+
(Record<Keys & (keyof T) & (K['length'] extends 0 ? string : K[number]), postgres.SerializableParameter<TT> | postgres.JSONValue> & Record<string, any>)
165165

166-
type First<T, K extends readonly any[]> =
166+
type First<T, K extends readonly any[], TT> =
167167
// Tagged template string call
168168
T extends TemplateStringsArray ? TemplateStringsArray :
169169
// Identifiers helper
170170
T extends string ? string :
171171
// Dynamic values helper (depth 2)
172172
T extends readonly any[][] ? readonly postgres.EscapableArray[] :
173173
// Insert/update helper (depth 2)
174-
T extends readonly (object & infer R)[] ? (R extends postgres.SerializableParameter ? readonly postgres.SerializableParameter[] : readonly SerializableObject<R, K>[]) :
174+
T extends readonly (object & infer R)[] ? (R extends postgres.SerializableParameter<TT> ? readonly postgres.SerializableParameter<TT>[] : readonly SerializableObject<R, K, TT>[]) :
175175
// Dynamic values/ANY helper (depth 1)
176-
T extends readonly any[] ? (readonly postgres.SerializableParameter[]) :
176+
T extends readonly any[] ? (readonly postgres.SerializableParameter<TT>[]) :
177177
// Insert/update helper (depth 1)
178-
T extends object ? SerializableObject<T, K> :
178+
T extends object ? SerializableObject<T, K, TT> :
179179
// Unexpected type
180180
never
181181

@@ -365,7 +365,7 @@ declare namespace postgres {
365365
raw: T | null;
366366
}
367367

368-
interface ArrayParameter<T extends SerializableParameter[] = SerializableParameter[]> extends Parameter<T | T[]> {
368+
interface ArrayParameter<T extends readonly any[] = readonly any[]> extends Parameter<T | T[]> {
369369
array: true;
370370
}
371371

@@ -458,17 +458,17 @@ declare namespace postgres {
458458
| null
459459
| boolean
460460
| number
461-
| bigint // weak: require the `postgres.BigInt` type
462461
| string
463462
| Date
464463
| Uint8Array;
465464

466-
type SerializableParameter = never
465+
type SerializableParameter<T = never> = never
466+
| T
467467
| Serializable
468468
| Helper<any>
469469
| Parameter<any>
470470
| ArrayParameter
471-
| readonly SerializableParameter[];
471+
| readonly SerializableParameter<T>[];
472472

473473
type JSONValue = // using a dedicated type to detect symbols, bigints, and other non serializable types
474474
| null
@@ -584,15 +584,15 @@ declare namespace postgres {
584584
* @param rest Other optional arguments, depending on the helper type
585585
* @returns An helper object usable as tagged template parameter in sql queries
586586
*/
587-
<T, K extends Rest<T>>(first: T & First<T, K>, ...rest: K): Return<T, K>;
587+
<T, K extends Rest<T>>(first: T & First<T, K, TTypes[keyof TTypes]>, ...rest: K): Return<T, K>;
588588

589589
/**
590590
* Execute the SQL query passed as a template string. Can only be used as template string tag.
591591
* @param template The template generated from the template string
592592
* @param parameters Interpoled values of the template string
593593
* @returns A promise resolving to the result of your query
594594
*/
595-
<T extends readonly (object | undefined)[] = Row[]>(template: TemplateStringsArray, ...parameters: readonly (SerializableParameter | PendingQuery<any>)[]): PendingQuery<AsRowList<T>>;
595+
<T extends readonly (object | undefined)[] = Row[]>(template: TemplateStringsArray, ...parameters: readonly (SerializableParameter<TTypes[keyof TTypes]> | PendingQuery<any>)[]): PendingQuery<AsRowList<T>>;
596596

597597
CLOSE: {};
598598
END: this['CLOSE'];
@@ -605,7 +605,7 @@ declare namespace postgres {
605605
[name in keyof TTypes]: (value: TTypes[name]) => postgres.Parameter<TTypes[name]>
606606
};
607607

608-
unsafe<T extends any[] = (Row & Iterable<Row>)[]>(query: string, parameters?: SerializableParameter[], queryOptions?: UnsafeQueryOptions): PendingQuery<AsRowList<T>>;
608+
unsafe<T extends any[] = (Row & Iterable<Row>)[]>(query: string, parameters?: SerializableParameter<TTypes[keyof TTypes]>[], queryOptions?: UnsafeQueryOptions): PendingQuery<AsRowList<T>>;
609609
end(options?: { timeout?: number }): Promise<void>;
610610

611611
listen(channel: string, onnotify: (value: string) => void, onlisten?: () => void): ListenRequest;
@@ -618,9 +618,9 @@ declare namespace postgres {
618618
begin<T>(cb: (sql: TransactionSql<TTypes>) => T | Promise<T>): Promise<UnwrapPromiseArray<T>>;
619619
begin<T>(options: string, cb: (sql: TransactionSql<TTypes>) => T | Promise<T>): Promise<UnwrapPromiseArray<T>>;
620620

621-
array<T extends SerializableParameter[] = SerializableParameter[]>(value: T, type?: number): ArrayParameter<T>;
621+
array<T extends SerializableParameter<TTypes[keyof TTypes]>[] = SerializableParameter<TTypes[keyof TTypes]>[]>(value: T, type?: number): ArrayParameter<T>;
622622
file<T extends readonly any[] = Row[]>(path: string | Buffer | URL | number, options?: { cache?: boolean }): PendingQuery<AsRowList<T>>;
623-
file<T extends readonly any[] = Row[]>(path: string | Buffer | URL | number, args: SerializableParameter[], options?: { cache?: boolean }): PendingQuery<AsRowList<T>>;
623+
file<T extends readonly any[] = Row[]>(path: string | Buffer | URL | number, args: SerializableParameter<TTypes[keyof TTypes]>[], options?: { cache?: boolean }): PendingQuery<AsRowList<T>>;
624624
json(value: JSONValue): Parameter;
625625
}
626626

0 commit comments

Comments
 (0)