Node.js:如何避免Mongoose文档声明时的数据重复?
复用TypeScript类型定义实现Mongoose Document接口
我写了一段Mongoose相关的TypeScript代码,定义了data类型作为输出结果的参考,同时还有一个继承mongoose.Document的document接口用于Mongoose模型——但这两者的结构完全一致。我想复用data类型来定义document接口,避免重复写{name: string; active: boolean}这段代码,但试了两种写法都不行,求正确实现方式。
原始代码
import mongoose from "mongoose" export type data = { name: string active: boolean } export interface document extends mongoose.Document { name: string, active: boolean } export interface model extends mongoose.Model<document> { build(attrs: document): document }
尝试过的无效写法
export interface document extends mongoose.Document = data export interface document extends mongoose.Document { data }
正确实现方式
方式1:接口直接继承类型别名(TypeScript 2.2+支持)
TypeScript从2.2版本开始允许接口继承类型别名,直接把data的字段继承过来,同时保留mongoose.Document的特性:
import mongoose from "mongoose" // 建议类型名用大驼峰,符合TS规范 export type Data = { name: string active: boolean } // 同时继承mongoose.Document和Data类型 export interface Document extends mongoose.Document, Data {} export interface Model extends mongoose.Model<Document> { // 这里参数可以直接用Data,比用Document更合理(不需要mongoose的内置字段) build(attrs: Data): Document }
方式2:使用交叉类型合并
如果更倾向于用类型而非接口,也可以用交叉类型把mongoose.Document和Data合并:
import mongoose from "mongoose" export type Data = { name: string active: boolean } // 交叉类型合并两个类型的所有属性 export type Document = mongoose.Document & Data export interface Model extends mongoose.Model<Document> { build(attrs: Data): Document }
注意:TS里类型/接口名建议用大驼峰命名(比如Data、Document),避免和内置类型、库的类型冲突,也符合社区规范。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

