API
Result is a type that represents either success (Ok) or failure (Err).
See the module documentation for details.
Variants
Ok
@since 0.4.0-alphaOk(T);
Contains the success value.
Examples
let x: Result<number, string> = Ok(42);
Err
@since 0.4.0-alphaErr(E);
Contains the error value.
Examples
let x: Result<number, string> = Err("Not found");
Implementations
and
@since 0.4.0-alphapublic and<U>(res: Result<U, E>): Result<T | U, E>
Returns res if the result is Ok, otherwise returns the Err value.
Arguments passed to and are eagerly evaluated;
if you are passing the result of a function call,
it is recommended to use and_then, which is lazily evaluated.
Examples
let x: Result<number, string>;
let y: Result<string, string>;
x = Ok(2);
y = Err("late error");
assert_eq!(x.and(y), Err("late error"));
x = Err("early error");
y = Ok("foo");
assert_eq!(x.and(y), Err("early error"));
x = Err("not a 2");
y = Err("late error");
assert_eq!(x.and(y), Err("not a 2"));
x = Ok(2);
y = Ok("different result type");
assert_eq!(x.and(y), Ok("different result type"));
and_then
@since 0.4.0-alphapublic and_then<U>(op: (value: T) => Result<U, E>): Result<T | U, E>
Calls op if the result is Ok, otherwise returns the Err value.
This function can be used for control flow based on Result values.
Often used to chain fallible operations that may return Err.
Examples
let x: Result<number, string>;
let y: Result<string, string>;
x = Ok(2);
y = Err("late error");
assert_eq!(
x.and_then(() => y),
Err("late error"),
);
x = Err("early error");
y = Ok("foo");
assert_eq!(
x.and_then(() => y),
Err("early error"),
);
x = Err("not a 2");
y = Err("late error");
assert_eq!(
x.and_then(() => y),
Err("not a 2"),
);
x = Ok(2);
y = Ok("different result type");
assert_eq!(
x.and_then(() => y),
Ok("different result type"),
);
expect
@since 0.4.0-alphapublic expect(msg: string): T
Returns the contained Ok value.
Because this method may throw, its use is generally discouraged.
Instead, prefer to use pattern matching and handle the Err case explicitly,
or call unwrap_or, unwrap_or_else, or unwrap_or_default.
Recommend that expect messages are used to describe the reason
you expect the Result should be Ok.
Panics if the value is an Err,
with a panic message including the passed message, and the value of the Err.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_eq!(x.expect("should return 42"), 42);
x = Err("unknown value");
assert_err!(
() => x.expect("should return 42"),
'should return 42: "unknown value"',
);
expect_err
@since 0.4.0-alphapublic expect_err(msg: string): E
Returns the contained Err value.
Panics if the value is an Ok, with a panic message
including the passed message, and the content of the Ok.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_err!(
() => x.expect_err("should return unknown error value"),
"should return unknown error value: 42",
);
x = Err("unknown error value");
assert_eq!(
x.expect_err("should return unknown error value"),
"unknown error value",
);
inspect
@since 0.4.0-alphapublic inspect(f: (value: T) => void): Result<T, E>
Calls a function with a reference to the contained value if Ok.
Returns the original result.
Examples
function get<T>(arr: T[], idx: number): Result<T, string> {
const item = arr.at(idx);
return item !== undefined ? Ok(item) : Err("Not found");
}
const list = [1, 2, 3, 4, 5];
let has_inspected = false;
let x = get(list, 2).inspect((_v) => {
has_inspected = true;
});
assert_eq!(x, Ok(3));
assert_eq!(has_inspected, true);
inspect_err
@since 0.4.0-alphapublic inspect_err(f: (err: E) => void): Result<T, E>
Calls a function with a reference to the contained value if Err.
Returns the original result.
Examples
function get<T>(arr: T[], idx: number): Result<T, string> {
const item = arr.at(idx);
return item !== undefined ? Ok(item) : Err("Not found");
}
const list = [1, 2, 3, 4, 5];
let has_inspected = false;
let x = get(list, 9).inspect_err((_e) => {
has_inspected = true;
});
assert_eq!(x, Err("Not found"));
assert_eq!(has_inspected, true);
is_err
@since 0.4.0-alphapublic is_err(): boolean
Returns true if the result is Err.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_eq!(x.is_err(), false);
x = Err("Not found");
assert_eq!(x.is_err(), true);
is_err_and
@since 0.4.0-alphapublic is_err_and(f: (err: E) => boolean): boolean
Returns true if the result is Err and the value inside of it matches a predicate.
Examples
let x: Result<{ html: string }, { statusCode: number }>;
x = Err({ statusCode: 500 });
assert_eq!(
x.is_err_and((err) => err.statusCode === 404),
false,
);
x = Err({ statusCode: 404 });
assert_eq!(
x.is_err_and((err) => err.statusCode === 404),
true,
);
x = Ok({ html: "value" });
assert_eq!(
x.is_err_and((err) => err.statusCode === 404),
false,
);
is_ok
@since 0.4.0-alphapublic is_ok(): boolean
Returns true if the result is Ok.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_eq!(x.is_ok(), true);
x = Err("Not found");
assert_eq!(x.is_ok(), false);
is_ok_and
@since 0.4.0-alphapublic is_ok_and(f: (value: T) => boolean): boolean
Returns true if the result is Ok and the value inside of it matches a predicate.
Examples
let x: Result<number, string>;
x = Ok(0);
assert_eq!(
x.is_ok_and((value) => value > 10),
false,
);
x = Ok(42);
assert_eq!(
x.is_ok_and((value) => value > 10),
true,
);
x = Err("Not found");
assert_eq!(
x.is_ok_and((value) => value > 10),
false,
);
map
@since 0.4.0-alphapublic map<U>(f: (value: T) => U): Result<T | U, E>
Maps a Result<T, E> to Result<U, E> by applying a function
to a contained Ok value, leaving an Err value untouched.
This function can be used to compose the results of two functions.
Examples
let x: Result<string, { statusCode: number }>;
x = Ok("42");
assert_eq!(
x.map((value) => Number.parseInt(value, 10)),
Ok(42),
);
x = Err({ statusCode: 404 });
assert_eq!(
x.map((value) => Number.parseInt(value, 10)),
Err({ statusCode: 404 }),
);
map_or
@since 0.4.0-alphapublic map_or<U>(default_value: U, f: (value: T) => U): U
Returns the provided default (if Err),
or applies a function to the contained value (if Ok).
Arguments passed to map_or are eagerly evaluated;
if you are passing the result of a function call,
it is recommended to use map_or_else, which is lazily evaluated.
Examples
let x: Result<string, string>;
x = Ok("foo");
assert_eq!(
x.map_or(42, (v) => v.length),
3,
);
x = Err("bar");
assert_eq!(
x.map_or(42, (v) => v.length),
42,
);
map_or_else
@since 0.4.0-alphapublic map_or_else<U>(default_f: () => U, f: (value: T) => U): U
Maps a Result<T, E> to U by applying fallback function default_f
to a contained Err value, or function f to a contained Ok value.
Examples
const k = 21
let x: Result<string, string>
x = Ok("foo")
assert_eq!(
x.map_or_else(
() => 2 k,
(v) => v.length,
),
3,
)
x = Err("bar")
assert_eq!(
x.map_or_else(
() => 2 k,
(v) => v.length,
),
42,
)
or
@since 0.4.0-alphapublic or(res: Result<T, E>): Result<T, E>
Returns res if the result is Err, otherwise returns the Ok value.
Arguments passed to or are eagerly evaluated;
if you are passing the result of a function call,
it is recommended to use or_else, which is lazily evaluated.
Examples
let x: Result<number, string>;
let y: Result<number, string>;
x = Ok(2);
y = Err("Not found");
assert_eq!(x.or(y), Ok(2));
x = Err("Not found");
y = Ok(100);
assert_eq!(x.or(y), Ok(100));
x = Ok(2);
y = Ok(100);
assert_eq!(x.or(y), Ok(2));
x = Err("Not found");
y = Err("Not found");
assert_eq!(x.or(y), Err("Not found"));
or_else
@since 0.4.0-alphapublic or_else(f: () => Result<T, E>): Result<T, E>
Calls f if the result is Err, otherwise returns the Ok value.
This function can be used for control flow based on result values.
Examples
let x: Result<string, { statusCode: number }>;
let y: Result<string, { statusCode: number }>;
x = Ok("barbarians");
y = Ok("vikings");
assert_eq!(
x.or_else(() => y),
Ok("barbarians"),
);
x = Err({ statusCode: 404 });
y = Ok("vikings");
assert_eq!(
x.or_else(() => y),
Ok("vikings"),
);
x = Err({ statusCode: 404 });
y = Err({ statusCode: 404 });
assert_eq!(
x.or_else(() => y),
Err({ statusCode: 404 }),
);
unwrap
@since 0.4.0-alphapublic unwrap(): T
Returns the contained Ok value.
Because this function may throw, its use is generally discouraged.
Prefer to call inside try/catch statement, or handle the Err case explicitly,
or call unwrap_or, unwrap_or_else, or unwrap_or_default.
Panics if the value is an Err, with a message provided by the Err’s value.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_eq!(x.unwrap(), 42);
x = Err("Not found");
assert_err!(
() => x.unwrap(),
TypeError,
"Called Result.unwrap() on an Err(E) value",
);
unwrap_err
@since 0.4.0-alphapublic unwrap_err(): E
Returns the contained Err value.
Panics if the value is an Ok, with a custom panic message provided by the Ok’s value.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_err!(
() => x.unwrap_err(),
TypeError,
"Called Result.unwrap_err() on an Ok value",
);
x = Err("Not found");
assert_eq!(x.unwrap_err(), "Not found");
unwrap_or
@since 0.4.0-alphapublic unwrap_or(default_value: T): T
Returns the contained Ok value or a provided default.
Arguments passed to unwrap_or are eagerly evaluated;
if you are passing the result of a function call,
it is recommended to use unwrap_or_else, which is lazily evaluated.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_eq!(x.unwrap_or(0), 42);
x = Err("Not found");
assert_eq!(x.unwrap_or(0), 0);
unwrap_or_else
@since 0.4.0-alphapublic unwrap_or_else(f: (err: E) => T): T
Returns the contained Ok value or computes it from a closure.
Useful for expensive default computations.
Examples
let x: Result<number, string>;
x = Ok(42);
assert_eq!(
x.unwrap_or_else((err) => err.length),
42,
);
x = Err("foo");
assert_eq!(
x.unwrap_or_else((err) => err.length),
3,
);