在fp-ts中,他们为更高级别的类型提供了这种解决方法:
export interface HKT<URI, A> {
readonly _URI: URI;
readonly _A: A;
}
它可以像这样使用:
export interface Foldable<F> {
readonly URI: F;
reduce: <A, B>(fa: HKT<F, A>, b: B, f: (b: B, a: A) => B) => B;
}
什么是成员_URI
什么是_A
?
This article written的作者fp-ts
非常好地解释了TypeScript's union types的文档。
_A
是我们香港电讯的价值类型:HKT<"Option", string> => Option<string>
。我们将看到映射如何工作。
_URI
是HKT的标识符,例如Option.ts。它有2个实例,None
和Some
,两者都有"Option"
作为他们的_URI
。
Taking a look at the usage of F
in Foldable
我们可以看到它用于Type
类型,以及A
; Type<F, A>
。假设F == "Option" & A == string
所以Type<F, A> == Type<"Option", string>
,这与Option<string>
非常相似。目前,我们不能将泛型类型传递给另一个泛型,因为它的泛型参数:<F,A>(fa: F<A>)
将无法编译,这是主要问题。
要实现Type<"Option", string> => Option<string>
,有几个“映射”接口(这在文章中有解释)。我们可以看到这对Option
here做了:
declare module './HKT' {
interface URI2HKT<A> {
Option: Option<A>
}
}
最左边的Option
是一个字符串键,最右边是实际的Option
类型,毕竟这是一个正常的记录界面。让我们快速浏览一下Type
:type Type<URI extends URIS, A> = URI2HKT<A>[URI]
的定义。
URI2HKIT
是从我们的"Option"
到我们实际的Option
的地图。它允许通过2个通用参数来获取我们的更高级别类型包含的值类型,解决了前面提到的泛型问题。