0

我正在使用 JSONata 从 JSON 构建 TypeScript OO 模型。

驱动因素之一是拥有 JSON 的完全类型化的对象模型表示。

如果我$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

这似乎是这里造成的。

目前我正在通过将对象的所有属性传递给工厂函数来解决它,例如:

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

有更好的选择吗?

4

1 回答 1

0

我在这里提出了这个问题。

然而,由于它是一个边缘案例,并且可以很容易地解决(通过将所有属性传递给工厂方法或覆盖$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;
}
于 2020-06-17T10:00:02.907 回答