import { IModelConstructor, Model } from '../model';
import { ObjectInstance } from './object';
import { ISanitizeOptions, ISchema, ISchemaOptions, IToObjectOptions, PopulateReference } from './schema';
export interface IModelInstance<T extends Model = Model> extends ObjectInstance<T> {
    schema: ModelSchema<T>;
    rawObject: T;
}
export declare type ModelInstance<T extends Model> = IModelInstance<T>;
export interface IModelOptions<T extends Model = Model> extends ISchemaOptions<ModelInstance<T>> {
    model: IModelConstructor<T>;
    callParentHooks?: boolean;
}
export declare class ModelSchema<T extends Model = Model> implements ISchema<T, ModelInstance<T>, Partial<T>> {
    readonly options: IModelOptions<T>;
    constructor(options: IModelOptions<T>);
    create(value: any, sanitizeOptions?: ISanitizeOptions): IModelInstance<T>;
    populate(instance: ModelInstance<T>, populateReference: PopulateReference): Promise<T>;
    toObject(instance: ModelInstance<T>, options?: IToObjectOptions): Partial<T>;
    validate(instance: ModelInstance<T>): Promise<void>;
}
