import type Model from './model';
import type Schema from './schema';
import type BluebirdPromise from 'bluebird';
import type { NodeJSLikeCallback, Options } from './types';
declare abstract class Document<T> {
    abstract _model: Model<T>;
    _id: string;
    abstract _schema: Schema<T>;
    [key: string]: any;
    /**
     * Document constructor.
     *
     * @param {object} data
     */
    constructor(data?: T);
    /**
     * Saves the document.
     *
     * @param {function} [callback]
     * @return {BluebirdPromise}
     */
    save(callback?: NodeJSLikeCallback<any>): BluebirdPromise<any>;
    /**
     * Updates the document.
     *
     * @param {object} data
     * @param {function} [callback]
     * @return {BluebirdPromise}
     */
    update(data: object, callback?: NodeJSLikeCallback<any>): BluebirdPromise<any>;
    /**
     * Replaces the document.
     *
     * @param {object} data
     * @param {function} [callback]
     * @return {BluebirdPromise}
     */
    replace(data: T | Document<T>, callback?: NodeJSLikeCallback<any>): BluebirdPromise<any>;
    /**
     * Removes the document.
     *
     * @param {function} [callback]
     * @return {BluebirdPromise}
     */
    remove(callback?: NodeJSLikeCallback<any>): BluebirdPromise<any>;
    /**
     * Returns a plain JavaScript object.
     *
     * @return {object}
     */
    toObject(): T extends object ? T : never;
    /**
     * Returns a string representing the document.
     *
     * @return {String}
     */
    toString(): string;
    /**
     * Populates document references.
     *
     * @param {String|Object} expr
     * @return {Document}
     */
    populate(expr: string | string[] | Partial<Options>[] | Partial<Options>): Document<T>;
}
export default Document;
