Одним из способов достижения этого (без использования someIf
в качестве функции-прототипа) является следующая
type A = number | string;
const x: A = 4;
const y: A = "y";
const isNumber = (a: any): a is number => typeof a === "number";
const someIf = <T>(ot: Opt<any>, f: (x: any) => x is T): Opt<T> =>
ot.caseOf(
t => (f(t) ? opt(t) : none),
() => none
);
const ox = someIf(
opt(x),
isNumber
); // Opt<number> <- Some(4)
const oy = someIf(
opt(y),
isNumber
); // Opt<number> <- None
Ссылка в песочнице
Идея это довольно просто. Сверните необязательное значение, если none
, нам нечего делать. В противном случае проверьте свернутое значение по типу guard. Если защита успешна, просто верните значение (теперь его тип сужен), иначе верните none
.