【问题标题】:TypeScript constructor mass assignmentTypeScript 构造函数批量赋值
【发布时间】:2019-07-16 08:50:27
【问题描述】:

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

它是为 MongoDB 设计的,所以我想分别为原始 MongoDB 文档和模型类提供一个接口。丑陋但工作的版本看起来像那样

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> {}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    其实好像是可以的

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 2016-09-13
      • 2023-03-03
      • 2016-06-03
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多