类似于java的JavaScript。lang.可选吗?
我正在寻找一个客户端JavaScript库,它可以让我编写类似于我在其他语言中使用某种风格的选项类型(例如java.lang.Optional)所能做的代码
我的目标是避免客户机代码中的null
/undefined
检查,并使API更加明确
以下是我希望能够编写的API:
var dictionary = {
key1: 'value1',
key2: 'value2'
}
function getValue(key){
var value = dictionary[key];
if(value !== null && value !== undefined)
return Optional.of(value);
else
return Optional.empty();
}
以下是客户端代码:
var value = getValue('key3');
if(value.isPresent())
console.log('got a value: ' + value.get().toUpperCase());
else
console.log('no value found!');
或者有时:
var value = getValue('unknown key').orElse('default value');
如果我在Optional.empty()
值上调用get()
,它应该抛出某种Error
。
如果我在null
或undefined
上调用Optional.of()
,它也应该抛出
# 1 楼答案
考虑到java.lang.Optional source,自己编写可选实现应该不会那么困难
尽管您必须考虑到一些差异,即Javascript区分了
undefined
和null
,但您没有泛型这样的概念,一些人认为map的Java实现是broken。尽管如此,它还是相当容易实现但是,我自己做了一个实现(optional.js),它适合我的需要,如果您愿意,您可以使用它,但它可能不满足您的所有要求(即
of()
不会对未定义或null抛出异常,但get()
会)在我的代码中,您的示例如下
顺便说一句,代码是这样的
对于Optional没有有效的用例,因为您可以轻松地替换它,它将执行空/未定义的检查。但是如果您需要像
filter
、map
、flatMap
和ifPresent
这样的方法,您将从中受益更多# 2 楼答案
tl;博士:
始终使用ESOptional chain。它在JavaScript方面更具语义和艺术性(可能使用Babel)。比如:
使用
Optional
类,TypeScript中的其他软件包可能不支持它,如果您只是想深入访问对象属性,那么它就有点容易了有关更多信息:
我尝试用TypeScript创建一个大致为
Optional
的类:在这里,您可以看到,当我想使用Optional访问属性时,它将如下所示:
使用
Optional chain
将如下所示:# 3 楼答案
对于某些使用场景,具有0到1个元素的数组非常适合
它很简单,具有用于创建和查询的简明语法,还提供了内置的filter()和map(),这是我使用可选选项的主要原因之一:
如果您愿意修改原型,您可以根据需要添加更健壮的orElse和语法糖