【问题标题】:Would an Option or Optional type (Option<T>) make sense in TypeScript?选项或可选类型 (Option<T>) 在 TypeScript 中有意义吗?
【发布时间】:2019-11-19 13:34:31
【问题描述】:

Haskell、Rust 等语言提供MaybeOption 类型。即使在 Java 中,现在也有 Optional 类型。

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

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

基本上,类型系统会强制您显式解开任何可能位于 Option 值内的值。是的,TypeScript 严格的 null 检查也可以实现这一点,但是,使用 Option 类型为您提供了一种(在我看来)更好的方法来处理潜在的 None 值,方法是提供 map(f: T -&gt; U): Option&lt;U&gt;mapOr(f: T -&gt; U, or: U): Option&lt;U&gt; 方法等。

例如,我希望下面的代码可以工作:

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);

这当然是一个非常简单的示例,其中使用 Option 类型有点过度设计。不过,它应该提供一个基本概念。

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

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

【问题讨论】:

  • 虽然这是一个很好的讨论主题,但讨论将基于意见,因此 SO 不是举行此类对话的论坛。 :)
  • 你提到的函数map可以这样定义:map&lt;T,U&gt;(val: T|null|undefined,f : T -&gt; U): U|null|undefined,实现起来很简单,mapOr的情况类似,你甚至可以将T|null|undefined别名为Option&lt;T&gt;我认为
  • 这些语言有这些类型的原因是因为它们没有联合类型但标记联合(是的,这两个是不同的)
  • @niceman 我同意这很容易实现(尽管我不确定我是否同意您提供的实现)但我想知道为什么似乎没有人这样做
  • @niceman 我是否正确理解您建议联合类型是选项类型的适当替代?我不这么认为。当然,我可以将值声明为Foo | undefined,但这不允许我在其之上编写流畅的 API。如果xFoo | undefined 类型,它可能是undefined,因此x.bar() 将失败。

标签: typescript optional


【解决方案1】:

编辑 2019

查看fp-ts

原答案

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

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

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2021-04-25
    相关资源
    最近更新 更多