diff --git a/_internal/types.ts b/_internal/types.ts
index 467a8cf06..28f8d6ad6 100644
--- a/_internal/types.ts
+++ b/_internal/types.ts
@@ -336,13 +336,22 @@ export type SWRConfiguration<
Fn extends BareFetcher<any> = BareFetcher<any>
> = Partial<PublicConfiguration<Data, Error, Fn>>
-export interface SWRResponse<Data = any, Error = any> {
- data: Data | undefined
- error: Error | undefined
- mutate: KeyedMutator<Data>
+export type SWRResponse<Data = any, Error = any> = { mutate: KeyedMutator<Data> } & ({
+ data: undefined
+ error: undefined
+ isValidating: true
+ isLoading: true
+} | {
+ data: Data
+ error: undefined
isValidating: boolean
- isLoading: boolean
-}
+ isLoading: false
+} | {
+ data: undefined
+ error: Error
+ isValidating: boolean
+ isLoading: false
+})
export type KeyLoader<Args extends Arguments = Arguments> =
| ((index: number, previousPageData: any | null) => Args)
diff --git a/infinite/types.ts b/infinite/types.ts
index c85f08364..e7833c556 100644
--- a/infinite/types.ts
+++ b/infinite/types.ts
@@ -34,8 +34,7 @@ export interface SWRInfiniteConfiguration<
fetcher?: Fn
}
-export interface SWRInfiniteResponse<Data = any, Error = any>
- extends SWRResponse<Data[], Error> {
+export type SWRInfiniteResponse<Data = any, Error = any> = SWRResponse<Data[], Error> & {
size: number
setSize: (
size: number | ((_size: number) => number)