Я пытаюсь передать обобщенную 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 , чтобы вы могли увидеть ее напрямую.