将对象映射到其他对象的干净方法?

min*_*hai 5 casting typing typescript

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

例如,假设我有这些类:

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

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

export class Info {
    value: string;
}
Run Code Online (Sandbox Code Playgroud)

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

export class Book {
    [...]

    fromDraft(Draft draft) {
        this.id = draft.id;
        this.name = draft.name;
        this.info = new Info();
        this.info.value = draft.summary;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来映射以相同方式命名的对象字段?例如DraftBookidname领域,同时还能够从定义自定义映射,如draft.summarybook.info.value

请注意,这与我的实际用例相去甚远。在这里,手动进行赋值并不是那么糟糕,但是对于具有许多类似命名字段的对象来说,这是一件很麻烦的事情。

谢谢!

Mos*_*Feu 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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

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