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
}