У меня была такая же проблема, как и у вас, а затем, наконец, удалось разрешить ее после прочтения документации в типизированных файлах TS mongoose (о которой я раньше не знал, и я не уверен, как долго документы были вокруг), в частности в этом разделе . Я понимаю, что это старый вопрос очень , но я думал, что это может помочь потерянному человеку в будущем. Изменить: я прочитал дату существующего ответа как март 2014 года, а не 14 марта.
Что касается вашего дела, вы захотите следовать аналогичный шаблон, который у вас есть, хотя вам нужно изменить несколько вещей в обоих файлах.
Файл IUser
IUser
в IUserDocument
. Document
из mongoose. Document
. Файл модели
IUser
на IUserDocument
, включая путь к модулю, если вы переименуете файл. IUserModel
к IUser
. IUser
простирается от, от IUserDocument, Document
до IUserDocument
. IUserModel
, который простирается от Model
. IUserModel
. User
с Model
на IUserModel
, так как IUserModel
теперь расширяет Model
.
на
. Вот как выглядит ваш файл модели с этими изменениями:
import * as bcrypt from 'bcryptjs';
import { Document, Schema, Model, model } from 'mongoose';
import { IUserDocument } from '../interfaces/IUserDocument';
export interface IUser extends IUserDocument {
comparePassword(password: string): boolean;
}
export interface IUserModel extends Model {
hashPassword(password: string): boolean;
}
export const userSchema: Schema = new Schema({
email: { type: String, index: { unique: true }, required: true },
name: { type: String, index: { unique: true }, required: true },
password: { type: String, required: true }
});
userSchema.method('comparePassword', function (password: string): boolean {
if (bcrypt.compareSync(password, this.password)) return true;
return false;
});
userSchema.static('hashPassword', (password: string): string => {
return bcrypt.hashSync(password);
});
export const User: IUserModel = model('User', userSchema);
export default User;
И ваш (недавно переименованный) модуль ../interfaces/IUserDocument
будет выглядеть так:
import { Document } from 'mongoose';
export interface IUserDocument extends Document {
email: string;
name: string;
password: string;
}
С учетом того, что циклы не имеют return
, break
и т. Д. (Например, исключение броска), полнота равна
O(n * (m + j)) == O(n * m) + O(n * j)
, если оба m
и j
являются константами у нас есть
O(n*m + n*j) == m * O(n) + j * O(n) == O(n)
если хотя бы один m
или j
такой, что m ~ n
или j ~ n
, то имеем
// here m ~ n and j is some const
O(n * m) + O(n * j) == O(n * n) + j * O(n) == O(n**2) + O(n) == O(n**2)
Как сказал @RobinBennet, ответ - O(n * (m + j))
.
Внешний цикл повторяется n раз (по одному на каждый элемент). Для каждого элемента во внешних циклах первый внутренний цикл повторяется m раз, а второй j - так что для каждого элемента вы выполняете O (m + j) шагов. Выполните итерацию по n элементам O (n * (m + j).
То есть, предполагая, что m, j не связаны с n - если, например, m = j = n, вы получите O (п ^ 2)