From 81cf6098412199c718008656e771610e5c59cc4c Mon Sep 17 00:00:00 2001 From: yifanwww Date: Mon, 15 Apr 2024 01:27:38 +0800 Subject: [PATCH] feat: narrow down Result type after isOk or isErr --- src/__tests__/result.test.ts | 18 ++++++++++++++++++ src/result.ts | 4 ++-- src/types.ts | 4 ++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/__tests__/result.test.ts b/src/__tests__/result.test.ts index 712d7cb..1532bec 100644 --- a/src/__tests__/result.test.ts +++ b/src/__tests__/result.test.ts @@ -32,6 +32,15 @@ describe(`Test method \`${RustlikeResult.name}.prototype.${RustlikeResult.protot expect(Err('Some error message').isOk()).toBe(false); }); + // eslint-disable-next-line jest/expect-expect + it('should narrow down result type', () => { + const result = Ok(1); + if (result.isOk()) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const expected: Result = result; + } + }); + it('should have correct examples doc', () => { function examples() { const x: Result = Ok(2); @@ -153,6 +162,15 @@ describe(`Test method \`${RustlikeResult.name}.prototype.${RustlikeResult.protot expect(Err('Some error message').isErr()).toBe(true); }); + // eslint-disable-next-line jest/expect-expect + it('should narrow down result type', () => { + const result = Err('Some error message'); + if (result.isErr()) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const expected: Result = result; + } + }); + it('should have correct examples doc', () => { function examples() { const x: Result = Ok(-3); diff --git a/src/result.ts b/src/result.ts index 60a0032..787146f 100644 --- a/src/result.ts +++ b/src/result.ts @@ -56,7 +56,7 @@ export class RustlikeResult implements Result { * * ref: https://doc.rust-lang.org/std/result/enum.Result.html#method.is_ok */ - isOk(): boolean { + isOk(): this is Result { return this._type === 'ok'; } @@ -125,7 +125,7 @@ export class RustlikeResult implements Result { * * ref: https://doc.rust-lang.org/std/result/enum.Result.html#method.is_err */ - isErr(): boolean { + isErr(): this is Result { return this._type === 'err'; } diff --git a/src/types.ts b/src/types.ts index f5b51f2..7367bfc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -28,7 +28,7 @@ export interface Result { * * ref: https://doc.rust-lang.org/std/result/enum.Result.html#method.is_ok */ - isOk(): boolean; + isOk(): this is Result; /** * Returns `true` if the result is `Ok` and the value inside of it matches a predicate. @@ -91,7 +91,7 @@ export interface Result { * * ref: https://doc.rust-lang.org/std/result/enum.Result.html#method.is_err */ - isErr(): boolean; + isErr(): this is Result; /** * Returns `true` if the result is `Err` and the value inside of it matches a predicate.