tsa*_*yen 7 javascript java null undefined optional
我正在寻找一个客户端JavaScript库,它允许我使用一些类型的Option类型编写类似于我在其他语言中可以做的代码,例如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();
}
Run Code Online (Sandbox Code Playgroud)
这是客户端代码:
var value = getValue('key3');
if(value.isPresent())
console.log('got a value: ' + value.get().toUpperCase());
else
console.log('no value found!');
Run Code Online (Sandbox Code Playgroud)
或者有时:
var value = getValue('unknown key').orElse('default value');
Run Code Online (Sandbox Code Playgroud)
如果我打电话get()的Optional.empty()价值,它应该抛出某种Error.如果我叫Optional.of()上null或者undefined,它应该奉送.
鉴于java.lang.Optional source,自己编写 Optional 实现不应该那么难。
尽管您必须考虑一些差异,即 ieJavascript 区分undefined和null,但您没有泛型这样的概念,并且 map 的 Java 实现被一些人认为是破碎的。尽管如此,它还是很容易实现的。
但是,我自己已经完成了一个实现(optional.js),它适合我的需要,如果您愿意,可以使用它,但它可能无法满足您的所有要求(即of()不会在 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());
});
Run Code Online (Sandbox Code Playgroud)
顺便提一句。像这样的代码
if(value.isPresent())
console.log('got a value: ' + value.get().toUpperCase());
else
console.log('no value found!');
Run Code Online (Sandbox Code Playgroud)
不是 Optional 的有效用例,因为您可以轻松地将其替换为空/未定义检查。但是,如果你需要类似的方法filter,map,flatMap和ifPresent,你会从中受益更多了。
\n\n对于那些在 2021 年仍然对此感兴趣的人。
\n
始终使用 ES可选链。它以 JavaScript 方式更具语义性和艺术性(也许使用Babel)。喜欢:
\nobj.val?.prop || defaultValue\nobj.val?.[expr]\nobj.arr?.[index]\nobj.func?.(args)\nRun Code Online (Sandbox Code Playgroud)\n使用TypeScript 中的其他Optional包可能不支持该类,并且如果您只想深入访问对象属性并不容易。
我尝试用 TypeScript 创建一个大致的Optional类:
obj.val?.prop || defaultValue\nobj.val?.[expr]\nobj.arr?.[index]\nobj.func?.(args)\nRun Code Online (Sandbox Code Playgroud)\n在这里你可以看到,当我想使用Optional访问属性时,它会像下面这样写:
\nOptional.of(dictionary)\n.map((obj)=> {\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n // \xe2\x9a\xa0\xef\xb8\x8f when you use like this, it may also cause an error.\n return descriptors.key1.value\n})\n.orElse(\'defaultValue\')\n\nRun Code Online (Sandbox Code Playgroud)\n使用Optional chain会像这样:
dictionary?.key1 || \'defaultValue\'\nRun Code Online (Sandbox Code Playgroud)\n