RJR
Convex Community2y ago
19 replies
RJ

Spooky types

Any TypeScript pros out there understand this behavior?

import {
  OptionalRestArgsOrSkip,
  useQuery,
} from "convex/react";

...

useQuery(anyQuery, "skip");
// ✅ All good

const skip: OptionalRestArgsOrSkip<any> = "skip";
// ❌ Type 'string' is not assignable to type '[args?: "skip" | EmptyObject | undefined] | [args: any]'.
useQuery(anyQuery, skip);
// ❌ Argument of type '[OptionalRestArgsOrSkip<Query>]' is not assignable to parameter of type 'OptionalRestArgsOrSkip<Query>'.

const skipAny: OptionalRestArgsOrSkip<any> = null as any;
// ✅ All good (it better be)
useQuery(anyQuery, skipAny);
// ❌ Argument of type '[[args?: "skip" | EmptyObject | undefined] | [args: any]]' is not assignable to parameter of type 'OptionalRestArgsOrSkip<Query>'.

// The type signature of `useQuery` is this:
function useQuery<Query extends FunctionReference<"query">>(
  query: Query,
  ...args: OptionalRestArgsOrSkip<Query>
): Query["_returnType"] | undefined
Was this page helpful?