Моделирование объекта Javascript в Purescript - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь смоделировать в Purescript тип данных SetOptions из 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")
  ]
}

Моя проблема - тип этого.

Я не могу использовать Object, поскольку содержащиеся в нем данные не являются однородными (merge относится к логическим значениям, mergeFields относится к массивам).

Я могу ' t Json, потому что мне нужно иметь FieldPath объектов в результате.

Единственное решение, которое я нашел до сих пор, это вернуть немного Json и затем javascript сторона разбирает его и добавляет FieldPath объекты, где это необходимо, но это выглядит грязно и хрупко.

1 Ответ

2 голосов
/ 12 марта 2020

Я бы, вероятно, пропустил представление копродукции SetOption на стороне PS и просто предоставил бы эти два "грязных" конструктора:

foreign import data SetOption :: Type

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

mergeFields :: MergeFields -> SetOption
mergeFields mf = unsafeCoerce { mergeFields: mf }

Я бы, вероятно, сделал бы то же самое для MergeFields копродукции.

Мы делаем что-то подобное в нашем проекте сообщества - привязки материалов: purescript-react-basic-mui. Кроме того, мы объединяем эти связанные конструкторы в записи для достижения «дешевого пространства имен», потому что мы генерируем все эти привязки из объявлений машинописного текста, но это не очень важно в этом контексте. Пожалуйста, взгляните на некоторые определения в этом примере модуля:

https://github.com/purescript-react-basic-mui/purescript-react-basic-mui/blob/codegen-read-dts/src/MUI/Core/Badge.purs#L20

РЕДАКТИРОВАТЬ: Я думаю, что этот последний поток дискурса может быть хорошее дополнительное вдохновение для тебя @ macro sh.

...