Google cloud firestore 在Purescript中建模Javascript对象

Google cloud firestore 在Purescript中建模Javascript对象,google-cloud-firestore,purescript,Google Cloud Firestore,Purescript,我试图用Purescript对Firestore中的数据类型进行建模 到目前为止,我有以下几点 foreign import data FieldPath :: Type foreign import buildFieldPath :: Array String -> FieldPath foreign import fieldNames :: FieldPath -> Array String type MergeFields = Array (String \/ Field

我试图用Purescript对Firestore中的数据类型进行建模

到目前为止,我有以下几点

foreign import data FieldPath :: Type

foreign import buildFieldPath :: Array String -> FieldPath

foreign import fieldNames :: FieldPath -> Array String

type MergeFields = Array (String \/ FieldPath)

data SetOptions
  = MergeOption Merge
  | MergeFieldsOption MergeFields
请注意,
SetOptions
是一种求和类型,因为
merge
mergeFields
是互斥的(即使没有记录)

现在我需要将
SetOptions
转换成一个Javascript对象,这样我就可以将它从Javascript
firebase
库传递给某个函数

它应该是某种形式的

{
  "mergeFields": [
    "foo",
    new FieldPath("bar", "baz")
  ]
}
我的问题就是这样

我无法使用,因为包含的数据不是同质的(
merge
指布尔值,
mergeFields
指数组)

我无法使用,因为我需要在结果中包含
FieldPath
对象


到目前为止,我找到的唯一解决方案是返回一些
Json
,然后在javascript端解析它,并在需要的地方添加
FieldPath
对象,但它看起来又脏又脆。

我可能会跳过PS端的coproduct
SetOption
表示,只提供这两个“脏”构造函数:

foreign import data SetOption :: Type

merge :: Boolean -> SetOption
merge m = unsafeCoerce { merge: m }

mergeFields :: MergeFields -> SetOption
mergeFields mf = unsafeCoerce { mergeFields: mf }
对于
MergeFields
coproduct,我可能也会这样做

在我们的社区项目中,我们也在做类似的事情——材料ui绑定:
purescript-react-basic-mui
。此外,我们将这些相关的构造函数分组到记录中,以实现“廉价的名称空间”,因为我们是从typescript声明生成所有这些绑定,但在这种上下文中这并不重要。 请查看本示例模块中的一些定义:


编辑:我认为这对@macrosh来说是一个很好的额外启发。

看看的文档和示例,它允许您根据Purescript记录定义副产品。这些对于JS互操作来说非常好。@marcosh我不确定是否会通知您我的编辑,但我在回复的末尾添加了指向其他资源的链接。