Skip to content

Commit d5ae78e

Browse files
durranmrbrianevans
andauthored
feat(NODE-3692): make change stream events typing more generic (#3034)
Co-authored-by: Brian Evans <[email protected]>
1 parent 53b3164 commit d5ae78e

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

src/change_stream.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,23 +184,23 @@ export interface UpdateDescription<TSchema extends Document = Document> {
184184
}
185185

186186
/** @public */
187-
export type ChangeStreamEvents = {
187+
export type ChangeStreamEvents<TSchema extends Document = Document> = {
188188
resumeTokenChanged(token: ResumeToken): void;
189-
init(response: Document): void;
190-
more(response?: Document | undefined): void;
189+
init(response: TSchema): void;
190+
more(response?: TSchema | undefined): void;
191191
response(): void;
192192
end(): void;
193193
error(error: Error): void;
194-
change(change: ChangeStreamDocument): void;
194+
change(change: ChangeStreamDocument<TSchema>): void;
195195
} & AbstractCursorEvents;
196196

197197
/**
198198
* Creates a new Change Stream instance. Normally created using {@link Collection#watch|Collection.watch()}.
199199
* @public
200200
*/
201-
export class ChangeStream<
202-
TSchema extends Document = Document
203-
> extends TypedEventEmitter<ChangeStreamEvents> {
201+
export class ChangeStream<TSchema extends Document = Document> extends TypedEventEmitter<
202+
ChangeStreamEvents<TSchema>
203+
> {
204204
pipeline: Document[];
205205
options: ChangeStreamOptions;
206206
parent: MongoClient | Db | Collection;

test/types/mongodb.test-d.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { MongoClient } from '../../src/mongo_client';
33
import { Collection } from '../../src/collection';
44
import { AggregationCursor } from '../../src/cursor/aggregation_cursor';
55
import type { FindCursor } from '../../src/cursor/find_cursor';
6+
import type { ChangeStreamDocument } from '../../src/change_stream';
67
import type { Document } from 'bson';
78
import { Db } from '../../src';
89
import { Topology } from '../../src/sdam/topology';
@@ -19,9 +20,14 @@ expectDeprecated(Db.prototype.unref);
1920
expectDeprecated(MongoDBDriver.ObjectID);
2021
expectNotDeprecated(MongoDBDriver.ObjectId);
2122

23+
interface TSchema extends Document {
24+
name: string;
25+
}
26+
2227
// test mapped cursor types
2328
const client = new MongoClient('');
24-
const coll = client.db('test').collection('test');
29+
const db = client.db('test');
30+
const coll = db.collection('test');
2531
const findCursor = coll.find();
2632
expectType<Document | null>(await findCursor.next());
2733
const mappedFind = findCursor.map<number>(obj => Object.keys(obj).length);
@@ -38,6 +44,17 @@ const composedMap = mappedAgg.map<string>(x => x.toString());
3844
expectType<AggregationCursor<string>>(composedMap);
3945
expectType<string | null>(await composedMap.next());
4046
expectType<string[]>(await composedMap.toArray());
47+
const tschemaColl = db.collection<TSchema>('test');
48+
const changeStream = tschemaColl.watch();
49+
changeStream.on('init', doc => {
50+
expectType<TSchema>(doc);
51+
});
52+
changeStream.on('more', doc => {
53+
expectType<TSchema | undefined>(doc);
54+
});
55+
changeStream.on('change', doc => {
56+
expectType<ChangeStreamDocument<TSchema>>(doc);
57+
});
4158

4259
const builtCursor = coll.aggregate();
4360
// should allow string values for the out helper

0 commit comments

Comments
 (0)