Skip to content

Commit 68c3930

Browse files
fix: improve query response and input types (#1416)
1 parent ea1ef5f commit 68c3930

1 file changed

Lines changed: 15 additions & 3 deletions

File tree

‎services/data/src/engine/DataEngine.ts‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { DataEngineLink } from './types/DataEngineLink'
88
import { QueryExecuteOptions } from './types/ExecuteOptions'
99
import { JsonMap, JsonValue } from './types/JsonValue'
1010
import { Mutation } from './types/Mutation'
11-
import { Query } from './types/Query'
11+
import type { Query, ResourceQuery } from './types/Query'
1212

1313
const reduceResponses = (responses: JsonValue[], names: string[]) =>
1414
responses.reduce<JsonMap>((out, response, idx) => {
@@ -22,15 +22,27 @@ export class DataEngine {
2222
this.link = link
2323
}
2424

25+
// Overload 1: When no generic is provided, accept any Query and return inferred type
2526
public query(
27+
query: Query,
28+
options?: QueryExecuteOptions
29+
): Promise<Record<keyof typeof query, unknown>>
30+
31+
// Overload 2: When generic is provided, enforce that query keys match the generic keys
32+
public query<T extends Record<string, unknown>>(
33+
query: Record<keyof T, ResourceQuery>,
34+
options?: QueryExecuteOptions
35+
): Promise<T>
36+
37+
public query<TResult extends Record<string, unknown>>(
2638
query: Query,
2739
{
2840
variables = {},
2941
signal,
3042
onComplete,
3143
onError,
3244
}: QueryExecuteOptions = {}
33-
): Promise<JsonMap> {
45+
): Promise<TResult | Record<keyof typeof query, unknown>> {
3446
const names = Object.keys(query)
3547
const queries = names
3648
.map((name) => query[name])
@@ -48,7 +60,7 @@ export class DataEngine {
4860
.then((results) => {
4961
const data = reduceResponses(results, names)
5062
onComplete && onComplete(data)
51-
return data
63+
return data as TResult | Record<keyof typeof query, unknown>
5264
})
5365
.catch((error) => {
5466
onError && onError(error)

0 commit comments

Comments
 (0)