TypeScript构造函数批量分配

时间:2019-02-22 09:35:02

标签: typescript

我正在使用TypeScript实现数据库的数据模型,并且代码看起来非常丑陋且冗长,有没有更短的版本可以声明呢?

它用于MongoDB,因此我想分别为原始MongoDB文档和Model类提供一个接口。丑陋但工作的版本看起来像这样

interface PostDocument {
  id:   number
  text: string
}

class Post implements PostDocument {
  id:   number
  text: string

  constructor(doc: PostDocument) {
    this.id = doc.id
    this.text = doc.text
  }
}

理想的情况是,可以使用下面的代码,但是我不知道使用TypeScript是否可以实现类似的功能

class Model<D> {
  somehow declare properties from D on Model
  constructor(document: D) { Object.assign(this, document)  }
}

interface PostDocument {
  id:   number
  text: string
}

class Post extends Model<PostDocument> {}

1 个答案:

答案 0 :(得分:0)

实际上,似乎有可能

interface ModelConstructor<M, D> { new (document: D): M & D }

abstract class Model<D> {
  constructor(document: D) { Object.assign(this, document) }
}

function buildModel<D extends Object>(): ModelConstructor<Model<D>, D> {
  return Model as any
}

interface PostDocument {
  id:   number
  text: string
}

class Post extends buildModel<PostDocument>() {
}

const document: PostDocument = { id: 5, text: 'something' }
const post = new Post(document)
console.log(post.text)