From 12355483971e4018d0e7e3298cb18fe6e3185a1e Mon Sep 17 00:00:00 2001 From: Luca Schultz Date: Wed, 9 Oct 2024 20:59:02 +0200 Subject: [PATCH 1/2] feat: add `ResultValue` and `ResultError` helper types Signed-off-by: Luca Schultz --- src/index.ts | 6 ++++-- src/result-error.ts | 12 ++++++++++++ src/result-value.ts | 12 ++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/result-error.ts create mode 100644 src/result-value.ts diff --git a/src/index.ts b/src/index.ts index 00dcdc8b..96b736fa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,11 @@ -export { Result, ok, Ok, err, Err, fromThrowable, safeTry } from './result' +export { Err, Ok, Result, err, fromThrowable, ok, safeTry } from './result' export { ResultAsync, - okAsync, errAsync, fromAsyncThrowable, fromPromise, fromSafePromise, + okAsync, } from './result-async' +export type { ResultError } from './result-error' +export type { ResultValue } from './result-value' diff --git a/src/result-error.ts b/src/result-error.ts new file mode 100644 index 00000000..5f08872c --- /dev/null +++ b/src/result-error.ts @@ -0,0 +1,12 @@ +import { Result } from 'result' +import { ResultAsync } from 'result-async' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type ResultError | ResultAsync> = T extends Result< + infer _, + infer E +> + ? E + : T extends ResultAsync + ? E + : never diff --git a/src/result-value.ts b/src/result-value.ts new file mode 100644 index 00000000..f16effdc --- /dev/null +++ b/src/result-value.ts @@ -0,0 +1,12 @@ +import { Result } from 'result' +import { ResultAsync } from 'result-async' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type ResultValue | ResultAsync> = T extends Result< + infer U, + infer _ +> + ? U + : T extends ResultAsync + ? U + : never From c0243eb3a733d1effae9d40992e405c07ba9f2cd Mon Sep 17 00:00:00 2001 From: Luca Schultz Date: Thu, 24 Oct 2024 17:17:00 +0200 Subject: [PATCH 2/2] refactor: use existing types Signed-off-by: Luca Schultz --- src/_internals/utils.ts | 6 ------ src/index.ts | 16 +++++++++++++--- src/result-async.ts | 20 ++++++++++++++++---- src/result-error.ts | 12 ------------ src/result-value.ts | 12 ------------ src/result.ts | 19 +++++++++++++++---- 6 files changed, 44 insertions(+), 41 deletions(-) delete mode 100644 src/result-error.ts delete mode 100644 src/result-value.ts diff --git a/src/_internals/utils.ts b/src/_internals/utils.ts index 04196144..479b4789 100644 --- a/src/_internals/utils.ts +++ b/src/_internals/utils.ts @@ -21,12 +21,6 @@ export type ExtractErrAsyncTypes ? E : never } -export type InferOkTypes = R extends Result ? T : never -export type InferErrTypes = R extends Result ? E : never - -export type InferAsyncOkTypes = R extends ResultAsync ? T : never -export type InferAsyncErrTypes = R extends ResultAsync ? E : never - /** * Short circuits on the FIRST Err value that we find */ diff --git a/src/index.ts b/src/index.ts index 96b736fa..cb338313 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,14 @@ -export { Err, Ok, Result, err, fromThrowable, ok, safeTry } from './result' +export { + Err, + Ok, + Result, + err, + fromThrowable, + ok, + safeTry, + InferErrTypes, + InferOkTypes, +} from './result' export { ResultAsync, errAsync, @@ -6,6 +16,6 @@ export { fromPromise, fromSafePromise, okAsync, + InferAsyncErrTypes, + InferAsyncOkTypes, } from './result-async' -export type { ResultError } from './result-error' -export type { ResultValue } from './result-value' diff --git a/src/result-async.ts b/src/result-async.ts index 01f2f13e..318b4217 100644 --- a/src/result-async.ts +++ b/src/result-async.ts @@ -5,6 +5,8 @@ import type { IsLiteralArray, MemberListOf, MembersToUnion, + InferErrTypes, + InferOkTypes, } from './result' import { Err, Ok, Result } from './' @@ -13,12 +15,22 @@ import { combineResultAsyncListWithAllErrors, ExtractErrAsyncTypes, ExtractOkAsyncTypes, - InferAsyncErrTypes, - InferAsyncOkTypes, - InferErrTypes, - InferOkTypes, } from './_internals/utils' +/** + * Extract the ok type from a `ResultAsync` type + * @example + * type OkType = InferAsyncOkTypes> // number + */ +export type InferAsyncOkTypes = R extends ResultAsync ? T : never + +/** + * Extract the error type from a `ResultAsync` type + * @example + * type ErrType = InferAsyncErrTypes> // string + */ +export type InferAsyncErrTypes = R extends ResultAsync ? E : never + export class ResultAsync implements PromiseLike> { private _promise: Promise> diff --git a/src/result-error.ts b/src/result-error.ts deleted file mode 100644 index 5f08872c..00000000 --- a/src/result-error.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Result } from 'result' -import { ResultAsync } from 'result-async' - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type ResultError | ResultAsync> = T extends Result< - infer _, - infer E -> - ? E - : T extends ResultAsync - ? E - : never diff --git a/src/result-value.ts b/src/result-value.ts deleted file mode 100644 index f16effdc..00000000 --- a/src/result-value.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Result } from 'result' -import { ResultAsync } from 'result-async' - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type ResultValue | ResultAsync> = T extends Result< - infer U, - infer _ -> - ? U - : T extends ResultAsync - ? U - : never diff --git a/src/result.ts b/src/result.ts index f2b84989..0bac5d82 100644 --- a/src/result.ts +++ b/src/result.ts @@ -1,15 +1,26 @@ -import { errAsync, ResultAsync } from './' +import { errAsync, ResultAsync, InferAsyncErrTypes } from './' import { createNeverThrowError, ErrorConfig } from './_internals/error' import { combineResultList, combineResultListWithAllErrors, ExtractErrTypes, ExtractOkTypes, - InferAsyncErrTypes, - InferErrTypes, - InferOkTypes, } from './_internals/utils' +/** + * Infers the ok types from a Result + * @example + * type OkType = InferOkTypes> // number + */ +export type InferOkTypes = R extends Result ? T : never + +/** + * Infers the error types from a Result + * @example + * type ErrType = InferErrTypes> // string + */ +export type InferErrTypes = R extends Result ? E : never + // eslint-disable-next-line @typescript-eslint/no-namespace export namespace Result { /**