Skip to content

Commit 2e25831

Browse files
authored
Merge pull request #563 from mattpocock/matt/made-err-infer-strings-narrowly
Made err() infer strings narrowly for easier error tagging
2 parents 5a91e55 + eadf50c commit 2e25831

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

.changeset/three-mice-act.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"neverthrow": patch
3+
---
4+
5+
Made err() infer strings narrowly for easier error tagging.

src/result.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,11 @@ export type Result<T, E> = Ok<T, E> | Err<T, E>
6262

6363
export const ok = <T, E = never>(value: T): Ok<T, E> => new Ok(value)
6464

65-
export const err = <T = never, E = unknown>(err: E): Err<T, E> => new Err(err)
65+
export function err<T = never, E extends string = string>(err: E): Err<T, E>
66+
export function err<T = never, E = unknown>(err: E): Err<T, E>
67+
export function err<T = never, E = unknown>(err: E): Err<T, E> {
68+
return new Err(err)
69+
}
6670

6771
/**
6872
* Evaluates the given generator to a Result returned or an Err yielded from it,

tests/typecheck-tests.ts

+21-3
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,11 @@ type CreateTuple<L, V = string> =
338338
});
339339

340340
(function it(_ = 'combines only err results into one') {
341-
type Expectation = Result<[ never, never ], number | string>;
341+
type Expectation = Result<[ never, never ], number | 'abc'>;
342342

343343
const result = Result.combine([
344344
err(1),
345-
err('string'),
345+
err('abc'),
346346
]);
347347

348348
const assignableToCheck: Expectation = result;
@@ -928,7 +928,7 @@ type CreateTuple<L, V = string> =
928928
});
929929

930930
(function it(_ = 'combines only err results into one') {
931-
type Expectation = Result<[ never, never ], [number, string]>;
931+
type Expectation = Result<[ never, never ], [number, 'string']>;
932932

933933
const result = Result.combineWithAllErrors([
934934
err(1),
@@ -999,6 +999,24 @@ type CreateTuple<L, V = string> =
999999
});
10001000
});
10011001
});
1002+
1003+
(function describe(_ = 'err') {
1004+
(function it(_ = 'infers the error type narrowly when it is a string') {
1005+
type Expectation = Result<never, 'error'>
1006+
1007+
const result = err('error')
1008+
1009+
const assignableToCheck: Expectation = result;
1010+
});
1011+
1012+
(function it(_ = 'infers the error type widely when it is not a string') {
1013+
type Expectation = Result<never, { abc: number }>
1014+
1015+
const result = err({ abc: 123 })
1016+
1017+
const assignableToCheck: Expectation = result;
1018+
});
1019+
})
10021020
});
10031021

10041022

0 commit comments

Comments
 (0)