@@ -8,7 +8,7 @@ import { DataEngineLink } from './types/DataEngineLink'
88import { QueryExecuteOptions } from './types/ExecuteOptions'
99import { JsonMap , JsonValue } from './types/JsonValue'
1010import { Mutation } from './types/Mutation'
11- import { Query } from './types/Query'
11+ import type { Query , ResourceQuery } from './types/Query'
1212
1313const 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