Combining multiple results
In some cases you might want to combine multiple results into a single result. This can be done using the Result.all and Result.allCatching methods. The Result.all method will return a successful result if all results are successful, otherwise it will return the first error that occurred. This is especially useful when you want to run multiple independent operations and bundle the outcome into a single result:
import { Result, AsyncResult } from "typescript-result";
class IOError extends Error {
readonly type = "io-error";
}
type Task = {
id: number;
name: string;
};
declare function createTask(name: string): AsyncResult<Task, IOError>;
const tasks = ["task-a", "task-b", "task-c"];
const result = Result.all(...tasks.map(createTask));
Due to its polymorphic nature, Result.all is very flexible. It can handle both synchronous and asynchronous results, and it can even work with other Result/AsyncResult instances or generators. This means you can use it to combine results from different sources, such as API calls, database queries, or any other operation that returns a value:
const userId = 123;
const result = Result.all(
fetchUserProfile(userId), // AsyncResult
fetchOrganizationInfo(userId), // AsyncResult
fetchUserPreferences(userId), // AsyncResult
);
const nextResult = result.map(
([profile, organization, preferences]) => {
return {
userId,
...profile,
organization,
preferences,
};
},
);INFO
Result.all determines whether it should return an AsyncResult or Result based on the provided arguments: if all arguments are synchronous, it returns a Result. If any argument is asynchronous, it returns an AsyncResult.
Example - running multiple operations and combining the results:
import { Result } from "typescript-result";
const result = Result.all(
"a" as const,
Promise.resolve("b" as const),
Result.ok("c" as const),
Result.try(async () => "d" as const),
() => "e" as const,
() => Result.try(async () => "f" as const),
() => Result.ok("g" as const),
async () => "h" as const,
function *() { return "i" as const; }
); // AsyncResult<["a", "b", "c", "d", "e", "f", "g", "h", "i"], Error>