Option


Keywords
option, monda, maybe, error catch, typescript
License
ISC
Install
npm install fpie-option@0.0.18

Documentation

fpie-option

fpie-option 是一个类Monda容器,提供了空值判断与错误捕获,共有两个状态,分别为SomeNone

import;

import { Some, isSome, None, isNone, Task } from "fpie-option";
import { Ok, isOk, Err, isErr, Step } from "fpie-option";

Some

此状态代表正常

  1. isSome方法判断
isSome(Some(1)); // 返回 true
  1. map属性方法 操作
Some(1).map((x) => x + 1); // 返回 Some(2)
  1. join属性方法 获取
Some(1).join(); // 返回 1

None

此状态代表nullError

  1. isNone方法判断
isNone(None()); // 返回 true
  1. map属性方法 操作 值(不执行map中的函数)
None(1).map((x) => x + 1); // 返回 None(1)
  1. join属性方法 获取
None(1).join(); // 返回 1

值为nullNone().join() 返回 null

报错ErrorNone('err msg').join() 返回错误信息

Some & None

  1. SomeNone均不会产生嵌套,也不会互相存储
Some(Some(1)); // 返回 Some(1)
Some(None(1)); // 返回 None(1)
None(Some(1)); // 返回 None(1)
None(None(1)); // 返回 None(1)
  1. Some值为空,或报错,会自动转为None
Some(); // 返回 None()
Some(1).map(() => {}); // 返回 None()
Some(1).map(() => {
  throw "err";
}); // 返回 None('err')
  1. 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')
  1. SomeNone具有相同接口,故不用考虑其相互转换的情况,只需在最后join取值之前,判断类型即可。

Task

基于Promise,封装SomeNone

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类型,其转换规则与SomeNone的转换规则相同

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值为nullundefinedNaN时,并不会转换为Err

其余一致