Что ближе всего к перечислению результатов Rust в JavaScript?

#javascript #rust #error-handling #boolean #rust-result

Вопрос:

Я снова занимаюсь автоматизацией Selenium в JavaScript, и у меня есть несколько методов, которые возвращают логические значения для веб-страницы. Например, у меня есть метод isB2B (), который возвращает, предназначена ли форма заказа, которую я автоматизирую, для заказа B2B. Он полагается на частный метод #getMarketType (), который возвращает либо тип рынка в виде строки, либо значение false, в зависимости от того, удалось ли ему получить тип рынка со страницы с помощью Selenium. Я хотел бы, чтобы возвращаемое значение для метода isB2B() указывало как значение успеха поиска, так и то, был ли тип рынка B2B. В Rust я бы использовал перечисление

 Result<bool, ()>
 

который может иметь любой из вариантов

 Ok(bool)
 

или

 Err(())
 

Как я могу добиться аналогичной функциональности в JavaScript?

Комментарии:

1. Я не думаю, что вы действительно можете сделать что-то эквивалентное на любом динамически типизированном языке, таком как JS. Идиоматический способ JS для обработки этих конкретных ситуаций, вероятно, состоял бы в том, чтобы создать исключение в случае ошибки, а затем попытаться обработать его в любых функциях, которые вызывают эту.

2. Вы всегда можете определить свой собственный Result объект в JS с помощью функций для управления им, как это делает Rust. Это то, что вы исследовали?

3. Вы можете вернуть объект, например {success: true} , при успешном выполнении или {error: {}} при сбое, и проверить typeof result.error != "undefined" , не произошла ли ошибка. Другим способом было бы просто вернуть логическое значение или объект ошибки в зависимости от того, был ли он успешным, и проверить typeof result == "object" , была ли это ошибка. Другим способом было бы передать два параметра обратного вызова (один для успешного выполнения, а другой для сбоя) и вызвать соответствующий обратный вызов в зависимости от того, была ли функция успешной.

4. Все эти комментарии были полезны, спасибо! @loganfsmyth Я думал об этом, но я хотел сделать что-то, что не полностью смутило бы разработчика JavaScript, когда они это увидели. Я использовал классы es6 со статическими членами для работы как перечисления, и я готов поспорить, что с некоторыми доработками я мог бы добиться результата.

5. @BenjaminPeinhardt Это не было бы совсем запутанным, просто немного не мейнстрим. Существует множество библиотек функционального программирования, которые поставляют Result или Either структурируют данные.