You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:43:26