이제 라이브러리와 프로젝트가 타입 안전성을 보장하기 위해 React Query가 TypeScript로 작성되었습니다!
명심해야 할 사항들:
React 쿼리의 유형은 일반적으로 매우 잘 전달되므로 유형 주석을 직접 제공할 필요가 없습니다.
const { data } = useQuery({
// ^? const data: number | undefined
queryKey: ['test'],
queryFn: () => Promise.resolve(5),
})
const { data } = useQuery({
// ^? const data: string | undefined
queryKey: ['test'],
queryFn: () => Promise.resolve(5),
select: (data) => data.toString(),
})
이 방법은 queryFn
에 잘 정의된 리턴 타입이 있는 경우에 가장 잘 작동합니다. 대부분의 data fetching 라이브러리는 default로 any
를 반환하므로 적절한 유형의 함수로 추출해야 합니다:
const fetchGroups = (): Promise<Group[]> =>
axios.get('/groups').then((response) => response.data)
const { data } = useQuery({ queryKey: ['groups'], queryFn: fetchGroups })
// ^? const data: Group[] | undefined
React Query는 status
필드와 파생된 상태 boolean flags로 구분되는 식별된 유니언 유형(discriminated union type)을 사용합니다. 이를 통해 예를 들어 success
상태 등을 확인하여 data
를 정의할 수 있습니다:
const { data, isSuccess } = useQuery({
queryKey: ['test'],
queryFn: () => Promise.resolve(5),
})
if (isSuccess) {
data
// ^? const data: number
}
오류 유형은 기본적으로 unknown
으로 설정됩니다. 이는 TypeScript가 catch clauses에서 기본적으로 제공하는 것과 일치합니다(useUnknownInCatchVariables 참조). 오류를 처리하는 가장 안전한 방법은 런타임 검사를 수행하는 것이고, 다른 방법은 data
, error
타입을 명시적으로 정의하는 것입니다:
const { error } = useQuery({ queryKey: ['groups'], queryFn: fetchGroups })
// ^? const error: unknown
if (error instanceof Error) {
error
// ^? const error: Error
}
const { error } = useQuery<Group[], Error>(['groups'], fetchGroups)
// ^? const error: Error | null
타입 추론과 관련된 팁과 요령은 커뮤니티 리소스에서 React Query and TypeScript를 참조하십시오. 최상의 타입 안전성을 확보하는 방법을 알아보려면 Type-safe React Query를 참조하십시오.
Reference