MongoDB nodejs驱动程序在使用typescript中的泛型类型时出错

r3i60tvu  于 2023-08-04  发布在  Go
关注(0)|答案(1)|浏览(113)

我正在制作一个简单的泛型类来执行CRUD操作

import * as mongoDB from 'mongodb';

class MongoStore<T extends Item> {
    collection: mongoDB.Collection<T>;
    ...
    async insert(x: T): Proimse<void> {
        await this.collection.insertOne(x);
    }
}

字符串
在插入时获取此类型错误

Argument of type 'T' is not assignable to parameter of type 'OptionalUnlessRequiredId<T>'.
  Type 'Item' is not assignable to type 'OptionalUnlessRequiredId<T>'.ts(2345)


看到错误消息后,我假设这是因为mongodb驱动程序试图处理_id的情况。找不到任何解决方法,只能使用任何。

await this.collection.insertOne(x as any);


有没有什么方法可以让这个工作不使用任何或我错过了什么?

66bbxpm5

66bbxpm51#

让我们看看insertOne()方法的签名:

export declare class Collection<TSchema extends Document = Document> {
    //...
    insertOne(doc: OptionalUnlessRequiredId<TSchema>, options?: InsertOneOptions): Promise<InsertOneResult<TSchema>>;
}

字符串
所以MongoStore类的泛型参数T可以等价于TSchema

import * as mongoDB from 'mongodb'; // tags: 5.6.0

interface Item extends mongoDB.Document {}

class MongoStore<T extends Item> {
    collection: mongoDB.Collection<T>;

    async insert(x: mongoDB.OptionalUnlessRequiredId<T>): Promise<void> {
        await this.collection.insertOne(x);
    }
}

(async function main() {
    const store = new MongoStore();
    const doc = {
        title: 'Record of a Shriveled Datum',
        content: 'No bytes, no problem. Just insert a document, in MongoDB',
    };
    await store.insert(doc);
})();


Playground链接

相关问题