Option 或可选类型 (Option<T>) 在 TypeScript 中有意义吗?

问题描述 投票:0回答:3

Haskell、Rust 等语言提供

Maybe
Option
类型。即使在 Java 中,现在也有
Optional
类型。

为了简单起见,我将在剩下的问题中将这种类型称为“选项类型”。 “可选类型”显然经常用于描述提供类型注释是可选的情况。

我很好奇以下问题:Option 类型在像 TypeScript 这样的语言中有意义吗? Option 类型的优点在其他语言中非常有说服力,但我发现自己在使用 TypeScript 编程时缺少该类型。

基本上,类型系统强制您显式解包 Option 值中可能存在的任何值。是的,TypeScript 严格的空检查也可以实现这一点,但是,使用 Option 类型为您提供了一种(在我看来)更好的方法来通过提供

None
map(f: T -> U): Option<U>
方法等来处理潜在的
mapOr(f: T -> U, or: U): Option<U>
值。

例如,我希望像下面的代码一样工作:

interface Foo {
    member: Option<string>
}
const opt: Option<Foo> = // ... some initialization
const memberLength: number = opt
    .map(x => x.member) // None if x is None, else Some(...)
    .map(x => x.length) // None if x.member is None, else Some(x.length)
    .unwrapOrElse(() => 0);

这当然是一个非常简单的示例,其中使用选项类型有点过度设计。不过,它应该给出一个基本的想法。

我目前不认为这是一个坏主意,但据我所知,似乎没有人实施它。这会对性能产生严重影响吗?还是还有其他我看不到的问题导致此方法不可行?

注意:我不是(主要)询问如何实现这一点(尽管这也是一个有趣的话题 - 但我对此有想法)。我主要关心的是找出为什么似乎还没人使用这样的东西。

typescript functional-programming pattern-matching option-type
3个回答
14
投票

编辑2019年

检查fp-ts

原答案

我错过了来自 Scala(和一些 Haskell)的它,所以我为它(和其他几个)制作了自己的库:MM(MIT 许可证)

随意破解、分叉等……;它是麻省理工学院授权的


0
投票

sniptt/monads 是一个简单的库,它向打字稿添加了 Rust 风格的

Option
Result
类型。我已经尝试过很多这些,这是最容易使用的。


0
投票

对于发现投票最多的答案的人:

  • 缺乏如何使用选项类型的任何示例(在答案本身中),或者
  • 浏览fp-ts网站的文档时,发现示例完全无法阅读。
  • 当您最终了解这些糟糕的示例时,发现没有像样的模式匹配方法(更多信息:https://github.com/gcanti/fp-ts-contrib/issues/63)。

请注意:

© www.soinside.com 2019 - 2024. All rights reserved.