我在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
吗?
1条答案
按热度按时间hc2pp10m1#
在这种情况下,区分
None
和Some<A>
并不是一个问题,因为Some<A>
有一个value
域,而None
没有。标准化代数数据类型的“问题”在于,具有相同功能的ADT也具有相同的结构(
Functor
有一个map
,Monad
有chain
,Foldable
有reduce
,它们看起来都一样)。TS是结构类型化的,所以如果你没有判别式,你可以混合和匹配ADT,这是不正确的(如连接两个不同的半群)这个实现不使用类,所以不能依赖
private value
来作为判别式,因此使用了标记。