TypeScript中Mongoose DocumentArray子文档数组创建问题求助
TypeScript中Mongoose子文档数组赋值的正确方式
直接添加子文档(最简单方案)
不用提前创建普通数组,直接调用Mongoose文档自带的子文档数组push方法,Mongoose会自动将普通对象转换为符合类型要求的子文档实例:
user.tikTokAdvertiserAccounts.push({ id: 'testid', name: 'testname' }); await user.save();
批量处理后赋值(适合需先处理数据的场景)
如果需要先批量处理子文档数据再赋值,需手动构建类型匹配的DocumentArray:
- 将普通数据转换为对应的子文档实例(借助
mongoose.Document并指定生成的文档类型) - 用
DocumentArray构造函数创建带正确泛型的数组
import mongoose from 'mongoose'; import { UserTikTokAdvertiserAccountDocument } from './types.gen'; // 批量转换为子文档实例 const advertiserDocs = [{ id: 'testid', name: 'testname' }].map(item => new mongoose.Document(item) as UserTikTokAdvertiserAccountDocument ); // 赋值给文档字段 user.tikTokAdvertiserAccounts = new mongoose.Types.DocumentArray<UserTikTokAdvertiserAccountDocument>(advertiserDocs); await user.save();
问题根源
Mongoose的子文档数组不是原生JS数组,而是DocumentArray类型——它继承了数组特性,还额外封装了create、$pop等Mongoose专属方法。你之前用普通UserTikTokAdvertiserAccount[]数组直接赋值,类型自然不匹配。
mongoose-tsgen生成的UserTikTokAdvertiserAccount是子文档的数据结构接口,而UserTikTokAdvertiserAccountDocument才是带Mongoose文档方法的实例类型,赋值时必须匹配DocumentArray<UserTikTokAdvertiserAccountDocument>类型。
关于mongoose-tsgen的说明
这个库的类型生成是准确的,并非库的问题。库作者建议转any是图省事,但完全可以通过上述方法在保留类型安全的前提下解决问题。
内容的提问来源于stack exchange,提问作者Robert Desmond
相关产品推荐
相关产品推荐

