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)); // 返回 true
-
map
属性方法 操作 值
Some(1).map((x) => x + 1); // 返回 Some(2)
-
join
属性方法 获取 值
Some(1).join(); // 返回 1
None
此状态代表null
或Error
-
isNone
方法判断
isNone(None()); // 返回 true
-
map
属性方法 操作 值(不执行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
其余一致