Невозможно использовать модель generi c в пн goose: аргумент типа 'x' нельзя назначить параметру типа MongooseFilterQuery - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь передать обобщенную c Mon goose модель в функцию в качестве параметра.

import mongoose, { Document, Model, Schema } from 'mongoose';

interface User {
    name: string;
    age: number;
    favouriteAnimal: string;
}

const UserSchema = new Schema({
    name: String,
    age: Number,
    favouriteAnimal: String,
});

const UserModel = mongoose.model<User & Document>('User', UserSchema);

function doSomething() {
    return UserModel.findOne({ user: 'john' }); // This is fine.
}

async function doSomethingGeneric<T extends User & Document>(model: Model<T>, key: keyof T) {
    const user = await model.findOne({ user: 'john' }); // Compiler errors on this line.
    return user![key];
}

Это вывод ошибки от компилятора:

error TS2345: Argument of type '{ user: string; }' is not assignable to parameter of type 'MongooseFilterQuery<Pick<T, Exclude<keyof T, "toString" | "removeListener" | "off" | "update" | "invalidate" | "increment" | "model" | "$isDeleted" | "remove" | "save" | "__v" | "$isDefault" | "$session" | ... 47 more ... | "modelName">>>'.

Type '{ user: string; }' is not assignable to type '{ [P in keyof Pick<T, Exclude<keyof T, "toString" | "removeListener" | "off" | "update" | "invalidate" | "increment" | "model" | "$isDeleted" | "remove" | "save" | "__v" | "$isDefault" | "$session" | ... 47 more ... | "modelName">>]?: (P extends "_id" ? [...] extends [...] ? Condition<...> : Condition<...> : [...] e...'.

23    const user = await model.findOne({ user: 'john' });

Тип UserModel mongoose.Model<User & mongoose.Document, {}>, поэтому я ожидал, что generic c будет удовлетворять тому же ограничения типа как не-обобщенный c метод. Куда я иду не так?

Редактировать: я воссоздал проблему на игровой площадке TS , чтобы вы могли увидеть ее напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...