Type issue after updating to v8.4.0
hasithaweerasinghe opened this issue · 3 comments
Hey everyone,
I hope you're doing well. I've recently encountered a type-related issue after updating ArangoJS from version 8.0.0 to 8.4.0 in our project. This issue pertains to the changes in type definitions that seem to have caused a regression in some core functionalities.
export async function getUser(name:string) {
const results = await db.query(
aql`FOR u in User FILTER ${name} == u.name RETURN u`
);
return await results.next();
}
The return type of the above database query has been updated to (8.4.0) Promise<ArrayCursor<undefined>>
, whereas in version 8.0.0, it was Promise<ArrayCursor<any>>
. Although it is possible to specify a type for the AQL string handler, it appears that the default type of any
is no longer functioning as expected.
export declare function aql<T = any>(templateStrings: TemplateStringsArray, ...args: AqlValue[]): GeneratedAqlQuery<T>;
Following image shows the VScode intellisense types:

Thanks in advance!
This feels like it's a bug in TypeScript actually. You can get the correct behavior by splitting the code into two statements:
const query = aql`FOR u in User FILTER ${name} == u.name RETURN u`; // type: GeneratedAqlQuery<any>
const results = await db.query(query); // type: ArrayCursor<any>
I'm investigating what is triggering this unexpected behavior in TypeScript.
With the help of @nikhil-varma we found multiple ways to force the intended behavior:
- Removing the
GeneratedAqlQuery
type soaql
casts its return value toAqlQuery
instead. - Adding an overload to
query
that explicitly accepts aGeneratedAqlQuery
argument. - Changing the type marker from
[type]?: T
to[type]: T
. - Changing the type marker from
[type]?: T
to[type]?: T | any
.
We went with the fourth solution as it forces the intended behavior without requiring major changes to the code or impacting backwards compatibility.
Thank you @pluma4345 & @nikhil-varma - @hasithaweerasinghe is off today and back Monday, so will try these fixes then and report back.