TypeScript

By default, both the useFunctionsQuery and useFunctionsCall are loosely typed. You can provide generic overrides if you wish to have strongly typed hooks.

useFunctionsQuery

The first two generic types represent the RequestData and ResponseData:

type RequestData = {
  id: string;
};

type ResponseData = {
  status: number;
  data: {
    name: string;
  };
};

const query = useFunctionsQuery<RequestData, ResponseData>(
  ["product", id],
  functions,
  "getProduct",
  // RequestData
  {
    id,
  }
);

if (query.isSuccess) {
  console.log(query.data.name); // ResponseData
}

Data Selector

A 3rd generic type can be provided if you are using a data selector.

type RequestData = {
  id: string;
};

type ResponseData = {
  status: number;
  data: {
    name: string;
  };
};

const query = useFunctionsQuery<RequestData, ResponseData, string>(
  ["product", id],
  functions,
  "getProduct",
  // RequestData
  {
    id,
  },
  undefined,
  {
    select(response: ResponseData): string {
      return response.data.name;
    },
  }
);

if (query.isSuccess) {
  console.log(query.data); // string
}

useFunctionsCall

The two generic types represent the RequestData and ResponseData:

type RequestData = {
  id: string;
  name: string;
};

type ResponseData = {
  status: number;
  data: {
    name: string;
  };
};

const mutation = useFunctionsCall<RequestData, ResponseData>(
  functions,
  "updateProduct"
);

// mutate call is now typed to RequestData
mutation.mutate({
  id: "...",
  name: "...",
});

if (mutation.isSuccess) {
  console.log(mutation.data.name); // ResponseData
}