在JavaScript中处理可选返回值的最佳方法是什么?

问题描述 投票:0回答:2

我正在尝试用JavaScript编写一个返回值或false的函数。在Scala中是否有某种“选项”返回类型?例如,在Scala中:

def foo(): Option[T]()

在JavaScript中,我唯一可以找到的方法是通过这样的不同返回值:

function foo() {
  if (x) {
    return "value";
  } else {
    return false;
  }
}

这是惯用的还是有更好的方法?

javascript scala functional-programming optional
2个回答
0
投票

不,没有。考虑到JS是“弱类型”。

通常,在这种情况下,您将返回nullundefined。对于返回对象类型的函数,通常是第一个,例如在DOM API中:

let node = document.getElementById("foo");

if (node) {
  // do something
}

如果ID为foo的节点不存在,则node将为null。该检查有效,因为nullfalsy值。

在您的示例中,如果您返回一个字符串,则最好的方法是返回一个空字符串(也为“ falsy”)或undefined

但是没有什么比Option是Scala或Rust。


0
投票

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一起使用的情况。]

© www.soinside.com 2019 - 2024. All rights reserved.