diff --git a/lib/util/result.spec.ts b/lib/util/result.spec.ts
index 775c077ebd43b4ee712c17ebc12191036ef5dd8f..61b0957ca8e29c3f1f8455d5f982bedf6245f92b 100644
--- a/lib/util/result.spec.ts
+++ b/lib/util/result.spec.ts
@@ -240,9 +240,8 @@ describe('util/result', () => {
       });
 
       it('converts error to Result', () => {
-        const result = Result.err<string>('oops').catch(() =>
-          Result.ok<number>(42),
-        );
+        const error: Result<number, string> = Result.err<string>('oops');
+        const result = error.catch((_err) => Result.ok<number>(42));
         expect(result).toEqual(Result.ok(42));
       });
 
@@ -600,15 +599,15 @@ describe('util/result', () => {
 
     describe('Catch', () => {
       it('converts error to AsyncResult', async () => {
-        const result = await Result.err<string>('oops').catch(() =>
-          AsyncResult.ok(42),
-        );
+        const error: Result<number, string> = Result.err<string>('oops');
+        const result = await error.catch(() => AsyncResult.ok(42));
         expect(result).toEqual(Result.ok(42));
       });
 
       it('converts error to Promise', async () => {
         const fallback = Promise.resolve(Result.ok(42));
-        const result = await Result.err<string>('oops').catch(() => fallback);
+        const error: Result<number, string> = Result.err<string>('oops');
+        const result = await error.catch(() => fallback);
         expect(result).toEqual(Result.ok(42));
       });
 
@@ -619,9 +618,9 @@ describe('util/result', () => {
       });
 
       it('converts AsyncResult error to Result', async () => {
-        const result = await AsyncResult.err<string>('oops').catch(() =>
-          AsyncResult.ok<number>(42),
-        );
+        const error: AsyncResult<number, string> =
+          AsyncResult.err<string>('oops');
+        const result = await error.catch(() => AsyncResult.ok<number>(42));
         expect(result).toEqual(Result.ok(42));
       });
     });
diff --git a/lib/util/result.ts b/lib/util/result.ts
index 7237d0d33d67b453209f4ce9024d45483cfa5462..f6649b65028faae1f49175b9a7bf1bd2eb2328da 100644
--- a/lib/util/result.ts
+++ b/lib/util/result.ts
@@ -480,28 +480,23 @@ export class Result<T extends Val, E extends Val = Error> {
   }
 
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (err: E) => Result<U, E | EE>,
-  ): Result<T | U, E | EE>;
+    fn: (err: E) => Result<U, EE>,
+  ): Result<T | U, EE>;
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (err: E) => AsyncResult<U, E | EE>,
-  ): AsyncResult<T | U, E | EE>;
+    fn: (err: E) => AsyncResult<U, EE>,
+  ): AsyncResult<T | U, EE>;
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (err: E) => Promise<Result<U, E | EE>>,
-  ): AsyncResult<T | U, E | EE>;
+    fn: (err: E) => Promise<Result<U, EE>>,
+  ): AsyncResult<T | U, EE>;
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (
-      err: E,
-    ) =>
-      | Result<U, E | EE>
-      | AsyncResult<U, E | EE>
-      | Promise<Result<U, E | EE>>,
-  ): Result<T | U, E | EE> | AsyncResult<T | U, E | EE> {
+    fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,
+  ): Result<T | U, EE> | AsyncResult<T | U, EE> {
     if (this.res.ok) {
-      return this;
+      return this as never;
     }
 
     if (this.res._uncaught) {
-      return this;
+      return this as never;
     }
 
     try {
@@ -833,25 +828,23 @@ export class AsyncResult<T extends Val, E extends Val>
   }
 
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (err: NonNullable<E>) => Result<U, E | EE>,
-  ): AsyncResult<T | U, E | EE>;
+    fn: (err: NonNullable<E>) => Result<U, EE>,
+  ): AsyncResult<T | U, EE>;
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (err: NonNullable<E>) => AsyncResult<U, E | EE>,
-  ): AsyncResult<T | U, E | EE>;
+    fn: (err: NonNullable<E>) => AsyncResult<U, EE>,
+  ): AsyncResult<T | U, EE>;
   catch<U extends Val = T, EE extends Val = E>(
-    fn: (err: NonNullable<E>) => Promise<Result<U, E | EE>>,
-  ): AsyncResult<T | U, E | EE>;
+    fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,
+  ): AsyncResult<T | U, EE>;
   catch<U extends Val = T, EE extends Val = E>(
     fn: (
       err: NonNullable<E>,
-    ) =>
-      | Result<U, E | EE>
-      | AsyncResult<U, E | EE>
-      | Promise<Result<U, E | EE>>,
-  ): AsyncResult<T | U, E | EE> {
-    const caughtAsyncResult = this.asyncResult.then((result) =>
-      // eslint-disable-next-line promise/no-nesting
-      result.catch(fn as never),
+    ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,
+  ): AsyncResult<T | U, EE> {
+    const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(
+      (result) =>
+        // eslint-disable-next-line promise/no-nesting
+        result.catch(fn as never),
     );
     return AsyncResult.wrap(caughtAsyncResult);
   }