创建新文档的函数的结果类型- mongoose模式和模型

vlju58qv  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(113)

在我们的typescript项目中,有一个myDocument.model.ts的内容:

import * as mongoose from 'mongoose';

const DocumentSchema = new mongoose.Schema({
  url: String,
  date: Date,
});

export default mongoose.model("Document", DocumentSchema);

repository.ts中有一个函数:

import Document from "./myDocument.model";
    
function addDocument(url:string):Document {
 let newDoc = new Document();
 newDoc.url = url;
 newDoc.date = new Date();
 newDoc.save();
 return newDoc;
}

我想指定这个addDocument(..)函数的返回类型-但不能。我将上面的导出解释为Document是一个类似于类的type,它可以被示例化-newDoc示例至少有两个字段(url,date),几个额外的字段,如_idid,一些示例和静态方法,如由mongoose.model(...)调用生成的save()。所以函数返回类型应该是Document

public addDocument(url:string): Document {
  ...
  return newDoc;
}

但在这种情况下,TS编译器会说
错误TS 2740:Type 'Document<unknown,{},{ url?:string; date?:Date; }> & { url?:string; date?:日期; } & { _id:“ObjectId; }”缺少类型“Document”中的以下属性:URL、alinkColor、all、anchors和250多个。
我错过了什么?

ruoxqz4g

ruoxqz4g1#

你犯了两个错误,即-
1.当您使用Document添加函数返回类型的签名时,您无意中错误地引用了浏览器中DOM中的Document。尝试将鼠标悬停在文档上,您将看到描述。
1.如果您希望使用Document模型的示例来键入它,则需要使用IntanceType实用程序,参数为typeof Document

import mongoose from "mongoose";

const DocumentSchema = new mongoose.Schema({
    url: String,
    date: Date,
});

const Document = mongoose.model("Document", DocumentSchema);

// Wrong, here you're using the DOM interface called Document
function addDocumentWrong(url: string): Document { 
    let newDoc = new Document();
    newDoc.url = url;
    newDoc.date = new Date();
    newDoc.save();
    return newDoc;
}

// Correct, here the an instance type of `typeof Document` model as the return type.
function addDocument(url: string): InstanceType<typeof Document> { // Correct
    let newDoc = new Document();
    newDoc.url = url;
    newDoc.date = new Date();
    newDoc.save();
    return newDoc;
}

Playground link

相关问题