jsonata $ merge instanceof информация потеряна - PullRequest
0 голосов
/ 16 июня 2020

Я создаю объектно-ориентированную модель TypeScript из JSON с использованием JSONata.

Одним из движущих факторов является наличие полностью типизированного представления объектной модели JSON.

If Я использую $merge([...]) при отображении из источника JSON в объектную модель instanceof информация не сохраняется.

Возможно, лучше проиллюстрировать на примере: -

Рассмотрим зарегистрированную функцию myFactory для создания экземпляра объекта:

function myFactory() : Person {
  return new Person();
}

Если я просто использую фабрику , например:

{
  person: $myFactory()
}

Тогда result.person instanceof Person будет true.

Однако, если я использую $merge([..]), информация о типе теряется:

{
  person: $merge([$myFactory(), source.someAttributes])
}

Тогда result.person instanceof Person это false.

Похоже, это вызвано здесь .

На данный момент я работаю над этим, передавая ALL свойства объекта передаются заводской функции, например:

function myFactory(other : any) : Person {
  return Object.assign(new Person(), other);
}
...
{
  person: $myFactory(source.someAttributes)
}

Есть ли лучший вариант?

1 Ответ

0 голосов
/ 17 июня 2020

Я задал вопрос здесь .

Однако, поскольку это крайний случай, и его можно легко обойти (передав все свойства в метод factory или переопределив $merge([...])) Я чувствую, что добавить больше нечего.

Мое локальное переопределение функции $merge([...]) - это для справки в будущем.

const expression: Expression = JSONata(mapping);
expression.registerFunction("merge", merge);

...

function merge(arg: any[]): any {
  if (typeof arg === undefined) {
    return undefined;
  }

  var result = Object.create(arg[0]);

  arg.forEach(function(obj: any) {
    for (var prop in obj) {
      result[prop] = obj[prop];
    }
  });
  return result;
}
...