i have bumped into following issue, i'm trying to implement infiniteQuery by using react-query tanstack, but i can't do it without additional checking of pageParam on it's type of number.
Could you please tell me how can i simplify this code without affecting of files structure
ApiClient.ts
import axios from "axios";
const apiClient = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com/'
})
class API<T> {
constructor(public endpoint: string) {
}
getAll = (pageParam: number) => {
return apiClient.get<T[]>(this.endpoint, {
params: {
_page: pageParam
}
}).then(res => res.data)
.catch(err => err)
}
}
export default API
todo-service.ts
import API from "../api-service/api-client.ts";
export interface Todo {
userId: number;
id: number;
title: string;
completed: boolean;
}
const UseTodoService = new API<Todo>('todos')
export default UseTodoService;
useTodo hook
import {useInfiniteQuery} from "@tanstack/react-query";
import {CACHE_KEY_TODO} from "../constants.ts";
import UseTodoService, {Todo} from "../http-service/todo-service.ts";
const UseTodo = () => {
return useInfiniteQuery<Todo[], Error>({
queryKey: CACHE_KEY_TODO,
queryFn: ({pageParam}) => {
if (typeof pageParam === 'number') return UseTodoService.getAll(pageParam);
else throw new Error("pageParam must be a number.");
},
getNextPageParam: (lastPage, allPages) =>
lastPage.length > 0 ? allPages.length + 1 : undefined,
initialPageParam: 1
})
}
export default UseTodo;
Todo component
import useTodo from "../hooks/useTodo.ts";
function TodoList() {
const {data, fetchNextPage } = useTodo()
return <>
<h1>TodoList</h1>
<ul className="list-group">
{data?.pages.map(todos => todos.map((todo, index) =>
<li className="list-group-item" key={index}>{todo.title}</li>))}
</ul>
<button onClick={() => fetchNextPage()} className="btn btn-primary mt-2">Fetch More</button>
</>
}
export default TodoList;
i'm expecting help of how you can refactor this code to make it more cleaner and without additional checking type of pageParams
queryFn: ({pageParam}) => {
if (typeof pageParam === 'number') return UseTodoService.getAll(pageParam);
else throw new Error("pageParam must be a number.");
},
pageParamis already typed asnumber. You can remove additional type checking.When you define a variable in TypeScript with a specific type, such as
initialPageParam: 1, TypeScript infers the type of that variable based on the assigned value. In this case,initialPageParamis inferred to be of typenumberbecause you've assigned it the value 1.The
pageParamvariable is also of typeTPageParam, which we can infer is a type alias for number based on your usage. Therefore, you don't need to perform a typeof check onpageParambecause TypeScript already knows it's anumber