node.js - tsc 不识别 mongoose 模式上的虚拟属性
我喜欢 mongoose virtual,但我无法在 TypeScript 中让它工作。
我正在使用 mongoose 的 InferSchemaType 来创建接口,如 mongoose 文档中“另一种方法”所述
TSC 不将它们识别为接口中的字段。
我尝试了两种建议的方式(见下方代码)。
import {connect, InferSchemaType, Schema, model} from 'mongoose';
const url = 'mongodb://admin:[email :27017/';
export const DBS_Actor = new Schema(
{
firstName: String,
lastName: String,
},
{
virtuals: {
fullName: {
get() {
return this.firstName + ' ' + this.lastName;
},
},
},
}
);
DBS_Actor.virtual('tagname').get(function () {
return 'Secrete Agent 007';
});
export type IActor = InferSchemaType<typeof DBS_Actor>;
export const Actor = model<IActor>('User', DBS_Actor);
run().catch(err => console.log(err));
async function run() {
await connect(url);
const actor = new Actor({
firstName: 'jojo',
lastName: 'kiki',
});
await actor.save();
console.log(actor.toJSON()); // {firstName: 'jojo', lastName: 'kiki', _id: new ObjectId("62e52b18d41b2bd4d2bd08d8"), __v: 0 }
console.log(actor.firstName); // jojo
// console.log(actor.fullname); //TSC error TS2339: Property 'fullname' does not exist on typ
// console.log(actor.tagname); //TSC error TS2339: Property 'tagname' does not exist on type...
}
答案#1
你需要指定 actor.toJSON({ virtuals: true }) 才能在 JSON 中访问它们。不过根据我的经验,TypeScript 仍然不知道这些虚拟属性,所以这确实很麻烦。对于你问题的这一部分,我没有解决办法。🙁
顺便提一下,.toJSON(...) 接受属性 flattenObjectIds,它会将它们转换为字符串。这对于通过网络发送文档非常有用。
Mongoose 的文档相当不错,尽管它们本可以更好。
答案#2
如果你想在你的类型上使用额外的字段,你可以扩展你的类型:
export type IActor = InferSchemaType<typeof DBS_Actor> & {
firstName: String
};
