Каков наилучший способ обработки необязательных возвращаемых значений в JavaScript? - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь написать функцию в JavaScript, которая возвращает либо значение, либо false. Есть ли какой-нибудь тип возвращаемого значения 'option', как в Scala? Например, в Scala:

def foo(): Option[T]()

Где в JavaScript я могу найти единственный способ сделать это через различные возвращаемые значения как таковые:

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

Это идиомати c или есть способ получше?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Нет, нет. Учтите, что JS «слабо напечатано».

Обычно в этом случае вы либо возвращаете null, либо undefined. Для функций, которые возвращают тип объекта, часто первым, например, в DOM API:

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

if (node) {
  // do something
}

Если узел с идентификатором foo не существует, node будет null. Проверка работает, потому что null является значением falsy.

В вашем примере, если вы вернете строку, вероятно, лучше всего будет либо вернуть пустую строку - это тоже "ложь" - или undefined.

Но нет ничего похожего на Option, Scala или Rust.

1 голос
/ 25 апреля 2020

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.

...