【发布时间】:2019-11-19 13:34:31
【问题描述】:
Haskell、Rust 等语言提供Maybe 或Option 类型。即使在 Java 中,现在也有 Optional 类型。
为简单起见,我将在剩下的问题中将此类型称为“选项类型”。 'Optional type' 显然经常用于描述提供类型注释是可选的情况。
我对以下问题感到好奇:Option 类型在 TypeScript 这样的语言中是否有意义? Option 类型的优点在其他语言中非常有说服力,我发现自己在使用 TypeScript 编程时缺少该类型。
基本上,类型系统会强制您显式解开任何可能位于 Option 值内的值。是的,TypeScript 严格的 null 检查也可以实现这一点,但是,使用 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);
这当然是一个非常简单的示例,其中使用 Option 类型有点过度设计。不过,它应该提供一个基本概念。
我目前看不出这是一个坏主意的原因,但据我所知,似乎没有人实施它。这会对性能产生严重影响吗?或者是否还有其他我看不到的问题导致这不可行?
注意:我不是(主要)询问如何实现这一点(尽管这也是一个有趣的话题——但我对此有想法)。我主要关心的是找出为什么似乎还没有人使用这样的东西。
【问题讨论】:
-
虽然这是一个很好的讨论主题,但讨论将基于意见,因此 SO 不是举行此类对话的论坛。 :)
-
你提到的函数
map可以这样定义:map<T,U>(val: T|null|undefined,f : T -> U): U|null|undefined,实现起来很简单,mapOr的情况类似,你甚至可以将T|null|undefined别名为Option<T>我认为 -
这些语言有这些类型的原因是因为它们没有联合类型但标记联合(是的,这两个是不同的)
-
@niceman 我同意这很容易实现(尽管我不确定我是否同意您提供的实现)但我想知道为什么似乎没有人这样做
-
@niceman 我是否正确理解您建议联合类型是选项类型的适当替代?我不这么认为。当然,我可以将值声明为
Foo | undefined,但这不允许我在其之上编写流畅的 API。如果x是Foo | undefined类型,它可能是undefined,因此x.bar()将失败。
标签: typescript optional