我正在寻找一个客户端JavaScript库,它允许我使用某种类型的Option类型编写类似于我在其他语言中可以执行的代码,例如java.lang.Optional.
我的目标是避免客户端代码中的空/未定义检查并使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(),它应该抛出某种错误.
如果我在null或undefined上调用Optional.of(),它也应该抛出.
最佳答案
鉴于java.lang.Optional source,自己编写一个Optional实现应该不会那么难.
虽然您必须考虑一些差异,即JavaScript区分undefined和null,但您没有Generics这样的概念,并且某些人认为map的Java实现为broken.然而,它实现起来相当容易.
但是,我自己完成了一个实现(optional.js),它适合我的需要,如果你愿意,你可以使用它,但它可能不满足你的所有要求(即()()不会在undefined或null上抛出异常,但get()呢)
用我的代码,你的例子就像
function getValue(key){
return Optional.of(dictionary[key]);
}
var value = getValue('key3');
value.ifPresent(function() {
console.log('got a value: ' + value.get().toUpperCase());
});
顺便说一句.像这样的代码
if(value.isPresent())
console.log('got a value: ' + value.get().toUpperCase());
else
console.log('no value found!');
对于Optional是无效的用例,因为您可以轻松替换它将null / undefined检查.但是如果你需要像filter,map,flatMap和ifPresent这样的方法,那么你将从中受益更多.