fp-ts - 在 fp-ts 中使用 Option 而不是 typescript 的 optional 有什么好处(问号)
问题描述
我开始使用 fp-ts 并且想知道使用 Option 类型而不是 typescript 由问号表示的可选值的默认概念有什么优势?
解决方案
Typescript 用问号告诉你是否有价值。但是,通常您会希望对它们执行某种计算,这就是 fp-ts 中的 Option 类型大放异彩的时候。
例如,假设我们在商店中有两件商品,并且它们可以选择有价格,我们想编写一个函数来获取它们的价格,否则我们返回一些表示“非出售”的值。首先,我们将看看我们如何在 vanilla typescript 中做到这一点
type ShopItem = {
price?:number
}
const getPrice = (item1: ShopItem, item2: ShopItem):number | null => {
const price1 = item1.price;
const price2 = item2.price;
if (price1 && price2) {
return price1 + price2;
}
return null;
}
这有几个问题。首先,那里有一个错误,因为如果价格为 0,那么该项目应该是待售的,但我们的虚假检查会短路并返回 null。其次,它不能很好地扩展。如果我们想添加多个 ShopItems 甚至是其他类型的具有可选值的项目,我们需要继续检查这些值是否为空。
现在让我们将其与 fp-ts 示例进行比较 https://codesandbox.io/s/laughing-wu-pffe3
import { some, none, ap, Option } from "fp-ts/lib/Option";
import { pipe } from 'fp-ts/lib/pipeable'
type ShopItem = {
price:Option<number> //this type will either be a Some<number> or None
}
const getPrice = (item1: ShopItem, item2: ShopItem): Option<number> =>
pipe(
some((a:number) => (b:number) => a + b),
ap(item1.price),
ap(item2.price)
);
它的工作方式是我们得到 item1 的价格和 item2 的价格,然后我们将它输入到 some.add 函数中。注意没有任何空检查,因为这已被抽象为我们的 None 类型。
推荐阅读
- google-cloud-platform - 有没有办法使用nod js监控api监控一个vm从另一个vm的ram使用情况
- c++ - c++20 中的 std::jthread 是什么?
- oracle - 在 Oracle 错误 39083 中使用 impdp 导入架构
- python - PANDAS 检查一个值是否为 NaN 并将行传输到另一个 DataFrame
- javascript - 在splunk的html面板中单击图像时如何传递或设置令牌?
- go - 在 Go 和 C 之间传递结构时,“cgo 参数具有指向 Go 指针的 Go 指针”
- javascript - Flask + Heroku:H12 请求超时错误
- c# - 在 Redis 中,我们可以检查缓存的年龄吗?
- docker - 如何在 kubernetes 中部署具有不同持久卷的多个 redis(无集群)pod
- asp.net-core - 将文件保存到另一个系统驱动器的 API POST 方法引发 500 错误