Lv1_junior_dev
자라나라실력실력
Lv1_junior_dev
전체 방문자
오늘
어제

주인장 GitHub 바로가기

    • 분류 전체보기 (110)
      • 주절주절 (6)
      • 프로젝트 회고록 (3)
      • 꿀팁 (3)
      • 알고리즘 풀이 (26)
      • 자바스크립트 - Vanilla JS (25)
      • 자바스크립트 - React.js (37)
      • 자바스크립트 - Next.js (4)
      • 자바스크립트 - TypeScript (5)
      • HTML (0)
      • CSS (1)

    인기 글

    hELLO · Designed By 정상우.
    Lv1_junior_dev

    자라나라실력실력

    [ReactQuery] useMutation과 useQuery에서 TypeScript 적용하기
    자바스크립트 - React.js

    [ReactQuery] useMutation과 useQuery에서 TypeScript 적용하기

    2023. 11. 7. 20:26

    ❗ useMutation에 TypeScript 적용

    export function useMutation<
      TData = unknown,
      TError = unknown,
      TVariables = void,
      TContext = unknown
    >

     

    ✔ TData: Mutate 함수가 반환하는 데이터의 타입)

    const { data } = useMutation<MyData>(/* mutateFn */);

     

    ✔TError: Mutate 함수 실행 중 발생할 수 있는 오류의 타입)

    const { error } = useMutation(/* mutateFn */, { onError: (err) => console.error(err) });

     

    ✔TVariables: Mutate 함수에 전달되는 변수의 타입

    const { mutate } = useMutation<MyData, MyError, MyVariables>(/* mutateFn */);

     

    ✔ TContext: 옵션으로 제공되는 컨텍스트의 타입

    const { mutate } = useMutation(/* mutateFn */, { context: { /* 컨텍스트 데이터 */ } });

     

    ✔ 예시

     

    이것들을 복합적으로 사용한 예시이다

    import { useMutation } from '@tanstack/react-query';
    
    interface UserData {
      id: number;
      name: string;
      email: string;
    }
    
    const updateUser = async (updatedData: UserData): Promise<UserData> => {
      const response = await fetch(`/api/users/${updatedData.id}`, {
        method: 'PUT',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(updatedData),
      });
    
      if (!response.ok) {
        throw new Error('Failed to update user data');
      }
    
      return response.json();
    };
    
    const { mutate, data, error } = useMutation<UserData, Error, UserData>(
      updateUser
    );
    
    // 사용 예시
    mutate({ id: 1, name: 'Updated Name', email: 'updated@email.com' });
    
    if (error) {
      // 에러 처리
    } else if (data) {
      // 데이터 사용
    }

     

    위 예시에서

     

    TData: useMutation 훅에서 반환된 data 변수는 updateUser 함수가 반환하는 데이터의 타입인 UserData로 설정된다.

    TError: error 변수는 updateUser 함수가 에러를 던질 수 있으므로, 에러의 타입으로 Error를 사용했다.

    TVariables: mutate 함수를 호출할 때 전달되는 변수의 타입은 UserData로 설정되었다. 이는 updateUser 함수가 사용자 데이터를 매개변수로 받기 때문이다.

    TContext: 해당 예제에서는 추가적인 컨텍스트를 사용하지 않았으므로 unknown으로 설정되어 있다.

     

    <
    TData : UserData
    TError : Error
    TVariables : UserData
    TContext : unknown

    >

     


    ❗ useQuery에 TypeScript 적용

    export function useQuery<
      TQueryFnData = unknown,
      TError = unknown,
      TData = TQueryFnData,
      TQueryKey extends QueryKey = QueryKey
    >

     

    ✔ TQueryFnData: 쿼리 함수(queryFn)가 반환하는 데이터의 타입

    const { data } = useQuery<MyData>(/* queryKey */, /* queryFn */);

     

    ✔  TError: 쿼리 실행 중 발생할 수 있는 오류의 타입

    const { error } = useQuery(/* queryKey */, /* queryFn */, { retry: false });

     

    ✔  TData: 쿼리에서 반환되는 실제 데이터의 타입

    const { data } = useQuery<MyData>(/* queryKey */, /* queryFn */);

     

    ✔  TQueryKey: 쿼리의 키를 나타내는 타입

    const { data } = useQuery(/* ['example', 1] */, /* queryFn */);

     

     

    ✔ 예시

     

    이것들을 복합적으로 사용한 예시이다

    interface UserData {
      id: number;
      name: string;
      email: string;
    }
    
    const fetchUserData = async (userId: number): Promise<UserData> => {
      const response = await fetch(`/api/users/${userId}`);
      if (!response.ok) {
        throw new Error('Failed to fetch user data');
      }
      return response.json();
    };
    
    const { data, error } = useQuery<UserData, Error, UserData>(['user', 1], () => fetchUserData(1));
    
    if (error) {
      // Handle error
    } else if (data) {
      // Use data
    }

     

     

    위 예시에서

    TQueryFnData: 쿼리 함수(queryFn)가 반환하는 데이터의 타입이다. 이 예제에서는 fetchUserData 함수가 Promise<UserData>를 반환하므로 UserData 타입이 TQueryFnData에 해당한다.

    TError: 쿼리 실행 중 발생할 수 있는 오류의 타입이다. 여기서는 일반적으로 네트워크 오류 등이 발생할 때 사용자에게 보여줄 에러의 타입으로 Error를 사용했다.

    TData: 쿼리에서 실제로 반환되는 데이터의 타입이다. 이 예제에서는 useQuery에서 data 변수를 통해 받는 데이터의 타입으로 UserData를 사용했다.

    TQueryKey: 쿼리의 키를 나타내는 타입이다. 여기서는 ['user', 1]와 같이 배열 형태로 키를 정의했으므로 QueryKey 타입으로 [string, number]와 같이 생각할 수 있습니다.


    <
    TQueryFnData: UserData
    TError: Error
    TData: UserData
    TQueryKey: ['user', 1]

    >

    '자바스크립트 - React.js' 카테고리의 다른 글

    [React.js] TDD(Test-Driven-Development) 방법론에 대해서 알아보자  (1) 2024.02.02
    [ReactQuery] useSuspenseQuery를 사용해서 Suspense 성능 개선 및 최적화를 해보자 !  (0) 2023.12.16
    [React.js] Recoil의 atom, atomfamily와 selector, selectorFamily에 대해서 알아보자  (0) 2023.09.12
    [ReactQuery] useMutation에 대해서 알아보자 ! (feat. Optimistic Updates, invalidateQueries)  (0) 2023.07.28
    [ReactQuery] refetch에 대해서 알아보자 ! (feat. 전역 refetching, Polling)  (0) 2023.07.24
      '자바스크립트 - React.js' 카테고리의 다른 글
      • [React.js] TDD(Test-Driven-Development) 방법론에 대해서 알아보자
      • [ReactQuery] useSuspenseQuery를 사용해서 Suspense 성능 개선 및 최적화를 해보자 !
      • [React.js] Recoil의 atom, atomfamily와 selector, selectorFamily에 대해서 알아보자
      • [ReactQuery] useMutation에 대해서 알아보자 ! (feat. Optimistic Updates, invalidateQueries)
      Lv1_junior_dev
      Lv1_junior_dev
      나는 성장이 고프다. 자라나라 개발 실력 !

      티스토리툴바