我正在尝试用JavaScript编写一个返回值或false的函数。在Scala中是否有某种“选项”返回类型?例如,在Scala中:
def foo(): Option[T]()
在JavaScript中,我唯一可以找到的方法是通过这样的不同返回值:
function foo() {
if (x) {
return "value";
} else {
return false;
}
}
这是惯用的还是有更好的方法?
不,没有。考虑到JS是“弱类型”。
通常,在这种情况下,您将返回null
或undefined
。对于返回对象类型的函数,通常是第一个,例如在DOM API中:
let node = document.getElementById("foo");
if (node) {
// do something
}
如果ID为foo
的节点不存在,则node
将为null
。该检查有效,因为null
是falsy
值。
在您的示例中,如果您返回一个字符串,则最好的方法是返回一个空字符串(也为“ falsy”)或undefined
。
但是没有什么比Option
是Scala或Rust。
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一起使用的情况。]