Javascript не поставляется с помеченными союзами. Однако вы можете легко реализовать их самостоятельно:
const union = type => (tag, o) =>
(o[type] = type, o.tag = tag.name || tag, o);
const match = (tx, o) =>
o[tx.tag] (tx);
const Option = union("Option");
const None = Option("None", {});
const Some = some => Option(Some, {some});
const head = xs =>
xs.length === 0
? None
: Some(xs[0]);
const xs = [11,22,33],
ys = [];
const foo = match(head(xs), {
None: () => 0,
Some: ({some}) => some
});
const bar = match(head(ys), {
None: () => 0,
Some: ({some}) => some
});
console.log(foo, bar);
Обратите внимание, что тип Option
, созданный Some
/ None
, содержит странное свойство Option: "Option"
. Преимущество этого заключается в том, что каждый тегированный тип объединения является уникальным по своей структуре, что упрощает их использование с Typescript.