清除将对象映射到其他对象的方法?

时间:2017-07-17 20:35:14

标签: typescript casting typing

有没有一种将对象映射到其他对象的好方法?图书馆的建议也很受欢迎。

例如,假设我有这些课程:

export class Draft {
    id: number;
    name: string;
    summary: string;
}

export class Book {
    id: number;
    name: string;
    info: Info;
}

export class Info {
    value: string;
}

传统上,要将Draft中的字段映射到Book,我必须手动为每个字段执行此操作:

export class Book {
    [...]

    fromDraft(Draft draft) {
        this.id = draft.id;
        this.name = draft.name;
        this.info = new Info();
        this.info.value = draft.summary;
    }
}

是否有更简单的方法来映射以相同方式命名的对象字段?例如DraftBook&#39} idname字段,同时还可以定义自定义映射,例如从draft.summary到{{ 1}}。

请注意,这远非我的实际用例。这里手动进行分配并不是那么糟糕,但对于具有许多类似命名字段的对象来说,它是一件非常繁琐的事。

谢谢!

2 个答案:

答案 0 :(得分:3)

关于复制同名属性,您可以使用Object.assign

this.summary

问题在于它还会创建const SHARED_NAMES = ["id", "name"]; fromDraft(Draft draft) { SHARED_NAMES.forEach(name => this[name] = draft[name]); this.info = new Info(); this.info.value = draft.summary; } ,但它是一种复制属性的便捷方式,因此如果您可以以不同方式对类进行建模,则可以使用它。

另一种选择是拥有一个共享属性名称列表,然后迭代它:

{{1}}

答案 1 :(得分:2)

无论使用TypeScript,您都可以使用lodash _.mergeWith并传递合并功能。

优势:更通用(如果您有更多逻辑可以添加它(例如复杂类型)

缺点:你需要lodash

类似的东西:

var a = {
  foo: [1, 2, 3],
  bar: true
}

var b = {
  foo: [4, 5, 6, 7],
  bar: false
}

var c = _.mergeWith(a, b, function(a, b) {
  if (a.concat) {
    return a.concat(b);
  }
  else {
    return b;
  }
})

console.log('c', c);
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>

http://jsbin.com/xugujon/edit?html,js