0.0.18 • Published 4 years ago
fpie-option v0.0.18
fpie-option
fpie-option 是一个类Monda容器,提供了空值判断与错误捕获,共有两个状态,分别为Some和None
import;
import { Some, isSome, None, isNone, Task } from "fpie-option";
import { Ok, isOk, Err, isErr, Step } from "fpie-option";Some
此状态代表正常
isSome方法判断
isSome(Some(1)); // 返回 truemap属性方法 操作 值
Some(1).map((x) => x + 1); // 返回 Some(2)join属性方法 获取 值
Some(1).join(); // 返回 1None
此状态代表null或Error
isNone方法判断
isNone(None()); // 返回 truemap属性方法 操作 值(不执行map中的函数)
None(1).map((x) => x + 1); // 返回 None(1)join属性方法 获取 值
None(1).join(); // 返回 1值为
null时None().join()返回 null报错
Error时None('err msg').join()返回错误信息
Some & None
Some和None均不会产生嵌套,也不会互相存储
Some(Some(1)); // 返回 Some(1)
Some(None(1)); // 返回 None(1)
None(Some(1)); // 返回 None(1)
None(None(1)); // 返回 None(1)- 若
Some值为空,或报错,会自动转为None
Some(); // 返回 None()
Some(1).map(() => {}); // 返回 None()
Some(1).map(() => {
throw "err";
}); // 返回 None('err')Some的错误捕获
若想在map方法中处理错误,可以传入第二个参数,用于捕获错误
Some(1).map(
() => {
throw "err";
},
() => "catch err"
); // 返回 Some('catch err')
Some(1).map(
() => {
throw "err";
},
() => {
throw "catch err failed";
}
); // 返回 None('catch err failed')Some和None具有相同接口,故不用考虑其相互转换的情况,只需在最后join取值之前,判断类型即可。
Task
基于Promise,封装Some和None
Task((res, rej) => res(1));
// 等价于
new Promise((res, rej) => res(1)).then(Some, None);
// 返回Promise<Some(1)>Task.resolve(1);
// 等价于
Promise.resolve(1).then(Some, None);
// 返回Promise<Some(1)>
Task.reject(1);
// 等价于
Promise.reject(1);
// 抛出 Error
Task.reject(1).map();
// 等价于
Promise.reject(1).then(Some, None);
// 返回Promise<None(1)>const add = (x) => x + 1;
Task((res, rej) => res(1)).map(add);
// 等价于
new Promise((res, rej) => res(1))
.then(Some, None)
.then((some) => some.map(add));
// 返回Promise<Some(2)>
Task仅有map属性方法,无join属性方法若想取出最终的
option类型,使用await
Task最终的option类型,其转换规则与Some和None的转换规则相同
async () => {
await Task((res, rej) => res(1)).map((v) => v + 1); // 返回 Some(2)
await Task((res, rej) => rej(1)).map((v) => v + 1); // 返回 None(1)
};Ok, isOk, Err, isErr, Step
依次对应参考Some, isSome, None, isNone, Task
区别为,当Ok值为null或undefined或NaN时,并不会转换为Err
其余一致