Una Option è una struttura dati che rappresenta un valore che può essere presente, oppure no. Se il valore è presente allora sarà Option.some(valore), se non lo è allora sarà Option.none. Si può pensare alle option come una alternativa safe a null e undefined.
Il modo più semplice per costruire una Option è utilizzare i costruttori some e none, che a loro volta ritornano un valore incapsulato in una Option.
import * as O from 'fp-ts/Option';
const noneValue = O.none;
const someValue = O.some('value');
Usa fromNullable se si vuole vincolare la creazione di una Option partendo da un valore che potrebbe essere null o undefined. Se il valore è nullable si ottiene una Option.none, altrimenti una Option.some(valore).
import * as O from 'fp-ts/Option';
const noneValue = O.fromNullable(null); // Option.None
const optionValue = O.fromNullable('value'); // Option.Some("value")
Se si vuole vincolare, invece, la creazione di una Option partendo da una condizione, si può usare il type constructor fromPredicate:
import * as O from 'fp-ts/Option';
const isEven = (number) => number % 2 === 0;
const noneValue = O.fromPredicate(isEven)(3); // Option.None
const optionValue = O.fromPredicate(isEven)(4); // Option.Some(4)
Si può costruire una Option anche partendo da un Either. Se l'Either è nello stato di errore (left) si ottiene una Option.none, se è nello stato di successo (right), si ottiene una Option.some(value) contenente il valore dell'Either:
import * as E from 'fp-ts/Either';
import * as O from 'fp-ts/Option';
const leftEither = E.left('whatever');
const rightEither = E.right('value');
const noneValue = O.fromEither(leftEither); // Option.None
const optionValue = O.fromEither(rightEither); // Option.Some("value")
Quando un valore è incapsulato da una Option, si può trasformare il valore contenuto in essa ed eseguire computazioni sequenziali.
Se si vuole trasformare il valore contenuto in una Option in base al fatto che sia Some o None, si può utilizzare la funzione map:
import * as O from 'fp-ts/Option';
const noneValue = O.none;
const someValue = O.of(2);
const double = (_: number) => _ * 2;
O.map(double)(noneValue) // Option.None
O.map(double)(someValue) // Option.some(4)