typescript 为什么在tp-ts中的Option类型上需要类似_tag属性的东西?

vlf7wbxs  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(210)

我在fp-ts库中查看Option类型。根据它的定义,我们在Some和None接口上有一个内部属性_tag
https://github.com/gcanti/fp-ts/blob/master/src/Option.ts

interface None {
  readonly _tag: 'None'
}

interface Some<A> {
  readonly _tag: 'Some'
  readonly value: A
}

type Option<A> = None | Some<A>

这个属性的用途是什么?是为了使用TypeScript的判别联合功能和模式匹配,还是有其他原因?我们可以在JS ES6中使用符号来代替None吗?

hc2pp10m

hc2pp10m1#

在这种情况下,区分NoneSome<A>并不是一个问题,因为Some<A>有一个value域,而None没有。
标准化代数数据类型的“问题”在于,具有相同功能的ADT也具有相同的结构(Functor有一个mapMonadchainFoldablereduce,它们看起来都一样)。TS是结构类型化的,所以如果你没有判别式,你可以混合和匹配ADT,这是不正确的(如连接两个不同的半群)
这个实现不使用类,所以不能依赖private value来作为判别式,因此使用了标记。

相关问题