Closed
Description
Prerequisites
- I have written a descriptive issue title
- I have searched existing issues to ensure the bug has not already been reported
Mongoose version
6.13.0, 7.6.13, 8.5.2
Node.js version
20.12.2
MongoDB server version
6.0.16
Typescript version (if applicable)
5.5.4
Description
┌──────────────────────────────────────────────────────────────────────────────────────────┐
│(method) Cursor<DocType = any, Options = never>.next(): Promise<DocType> │
│ │
│Get the next document from this cursor. Will return null when there are │
│no documents left. │
└──────────────────────────────────────────────────────────────────────────────────────────┘
The Cursor.next
method is documented to return null sometimes, but TypeScript thinks it always returns non-null.
Steps to Reproduce
import mongoose from 'mongoose';
const helloSchema = new mongoose.Schema({
name: { type: String, required: true },
status: { type: Boolean, required: true },
});
const Hello = mongoose.model('Hello', helloSchema);
const cursor = Hello.find().cursor();
let doc = await cursor.next();
doc = null;
It failed to compile:
mongoose-ts.mts:11:1 - error TS2322: Type 'null' is not assignable to type 'Document<unknown, {}, { name: string; status: boolean; }> & { name: string; status: boolean; } & { _id: ObjectId; }'.
Type 'null' is not assignable to type 'Document<unknown, {}, { name: string; status: boolean; }>'.
11 doc = null;
~~~
It also caused code like this to be flagged by TypeScript ESLint @typescript-eslint/no-unnecessary-condition
rule:
for (let doc = await cursor.next(); doc != null; doc = await cursor.next()) {
Expected Behavior
It should compile. doc
could be null, so TypeScript should allow assigning null to it.