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)