Skip to content

Commit fe9b41f

Browse files
committed
fixes #17: ignore mapped types on error-only results / ignore recovered types on success-only results
1 parent bfea25b commit fe9b41f

File tree

2 files changed

+272
-166
lines changed

2 files changed

+272
-166
lines changed

src/result.test.ts

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2465,9 +2465,6 @@ describe("Result", () => {
24652465
return 12;
24662466
});
24672467
expect(recoveredResult).toBeInstanceOf(AsyncResult);
2468-
expectTypeOf(recoveredResult).toEqualTypeOf<
2469-
AsyncResult<number, Error>
2470-
>();
24712468
Result.assertOk(await recoveredResult);
24722469
expect(spy).not.toHaveBeenCalled();
24732470
});
@@ -2628,6 +2625,60 @@ describe("Result", () => {
26282625
expectTypeOf(resultB.value).toBeNumber();
26292626
expectTypeOf(resultB.error).toBeUndefined();
26302627
});
2628+
2629+
it("should disregard any mapped values after a result can only be a failure", () => {
2630+
const syncFailure = Result.error(new ErrorA());
2631+
const asyncFailure = AsyncResult.error(new ErrorA());
2632+
2633+
const resultA = syncFailure.map((value) => {
2634+
expectTypeOf(value).toEqualTypeOf<never>();
2635+
return Result.ok(12);
2636+
});
2637+
expectTypeOf(resultA).toEqualTypeOf<Result<never, ErrorA>>();
2638+
2639+
const resultB = syncFailure.map(async () => Result.ok(12));
2640+
// It should disregard the async mapping as well
2641+
expectTypeOf(resultB).toEqualTypeOf<Result<never, ErrorA>>();
2642+
2643+
const resultC = syncFailure.mapCatching(() => Result.ok(12));
2644+
expectTypeOf(resultC).toEqualTypeOf<Result<never, ErrorA>>();
2645+
2646+
const resultD = asyncFailure.map((value) => {
2647+
expectTypeOf(value).toEqualTypeOf<never>();
2648+
return Result.ok(12);
2649+
});
2650+
expectTypeOf(resultD).toEqualTypeOf<AsyncResult<never, ErrorA>>();
2651+
2652+
const resultE = asyncFailure.mapCatching((value) => {
2653+
expectTypeOf(value).toEqualTypeOf<never>();
2654+
return Result.ok(12);
2655+
});
2656+
expectTypeOf(resultE).toEqualTypeOf<AsyncResult<never, ErrorA>>();
2657+
});
2658+
2659+
it("should disregard any recovered errors after a result can only be a success", () => {
2660+
const syncSuccess = Result.ok(12);
2661+
const asyncSuccess = AsyncResult.ok(12);
2662+
2663+
const resultA = syncSuccess.recover(() => Result.error(new ErrorA()));
2664+
expectTypeOf(resultA).toEqualTypeOf<Result<number, never>>();
2665+
2666+
const resultB = syncSuccess.recover(async () => Result.error(new ErrorA()));
2667+
expectTypeOf(resultB).toEqualTypeOf<Result<number, never>>();
2668+
2669+
const resultC = syncSuccess.recoverCatching(() =>
2670+
Result.error(new ErrorA()),
2671+
);
2672+
expectTypeOf(resultC).toEqualTypeOf<Result<number, never>>();
2673+
2674+
const resultD = asyncSuccess.recover(() => Result.error(new ErrorA()));
2675+
expectTypeOf(resultD).toEqualTypeOf<AsyncResult<number, never>>();
2676+
2677+
const resultE = asyncSuccess.recoverCatching(() =>
2678+
Result.error(new ErrorA()),
2679+
);
2680+
expectTypeOf(resultE).toEqualTypeOf<AsyncResult<number, never>>();
2681+
});
26312682
});
26322683

26332684
describe("AsyncResult", () => {

0 commit comments

Comments
 (0)