在 fp-ts 中将联合类型转换为 Either 类型
Transforming union type into Either type in fp-ts
在 typescript 中,如何将联合类型 A|B
转换为 fp-ts 的 Either<A,B>
?感觉很自然,一定有好的方法。
假设您有一个类型 number | string
,您可以执行以下操作:
import * as E from 'fp-ts/lib/Either'
import * as F from 'fp-ts/lib/function'
const toEither = F.flow(
E.fromPredicate(
x => typeof x === 'string', // Assuming that string is the Right part
F.identity
),
)
这将产生:
toEither(4)
{ _tag: 'Left', left: 4 }
toEither('Foo')
{ _tag: 'Right', right: 'Foo' }
但是
请记住,Either
不是用于拆分联合类型,而是用于将错误路径和您的结果的快乐路径包装在一种类型中。
我只是通过ts-node检查了上面的代码。我还没有看到 TS 为 toEither
函数
生成的实际类型
我发现这是不可能的
我最初的想法是,由于union
和Either
类型都是求和类型,所以它们在代数上是相等的。所以一定要有一种自然而美好的相互转化方式。
问题在于,有时您必须对具有泛型类型的实例进行类型检查,但在 Typescript 上根本无法做到这一点。
在 typescript 中,如何将联合类型 A|B
转换为 fp-ts 的 Either<A,B>
?感觉很自然,一定有好的方法。
假设您有一个类型 number | string
,您可以执行以下操作:
import * as E from 'fp-ts/lib/Either'
import * as F from 'fp-ts/lib/function'
const toEither = F.flow(
E.fromPredicate(
x => typeof x === 'string', // Assuming that string is the Right part
F.identity
),
)
这将产生:
toEither(4)
{ _tag: 'Left', left: 4 }
toEither('Foo')
{ _tag: 'Right', right: 'Foo' }
但是
请记住,Either
不是用于拆分联合类型,而是用于将错误路径和您的结果的快乐路径包装在一种类型中。
我只是通过ts-node检查了上面的代码。我还没有看到 TS 为 toEither
函数
我发现这是不可能的
我最初的想法是,由于union
和Either
类型都是求和类型,所以它们在代数上是相等的。所以一定要有一种自然而美好的相互转化方式。
问题在于,有时您必须对具有泛型类型的实例进行类型检查,但在 Typescript 上根本无法做到这一点。