Option<T> models the explicit presence (Some) or absence (None) of a value. Under the hood, it is an alias for Result<NonNullable<T>, never>, which means it shares the full Result API: .map(), .andThen(), .unwrapOr(), and everything else.
Creating options
nullable(value)
Converts any nullable value (T | null | undefined) into an Option<T>:
optionFromGuard(value, guard)
Creates an Option from an unknown value and a type guard. Returns Some if the guard passes, None otherwise:
The full Result API
Because Option<T> is Result<NonNullable<T>, never>, every Result method is available:
Converting to Result
Use .orElse() to assign a specific error to the None case, converting an Option to a Result:
Upgrading to Task
Option is ideal for synchronous lookups (like reading a cache or an environment variable). When you need to feed that optional value into an async pipeline, upgrade it to a Task with Task.fromOption():
Task.fromOption() is the idiomatic way to bridge synchronous optional values into larger async workflows. The None case becomes an Err that your Task pipeline can handle or recover from.
Practical example: cache-then-fetch