我正在使用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> {}
答案 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)