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.

Costruire una Option

Partendo da un valore

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")

Da una funzione predicato

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)

Da un'altra struttura dati

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")

Lavorare con i valori

Quando un valore è incapsulato da una Option, si può trasformare il valore contenuto in essa ed eseguire computazioni sequenziali.

Trasformare i valori con map

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)