import 'reflect-metadata';
import type { Class, Combine, Type } from 'ts-gems';
import { OpraSchema } from '../../schema/index.js';
import type { ApiDocument } from '../api-document.js';
import type { DocumentElement } from '../common/document-element.js';
import type { ComplexType } from './complex-type.js';
import { ComplexTypeBase } from './complex-type-base.js';
import { DataType } from './data-type.js';
import type { MappedType } from './mapped-type.js';
/**
 * @namespace MixinType
 */
export declare namespace MixinType {
    interface Metadata extends Combine<{
        kind: OpraSchema.MixinType.Kind;
        name?: string;
        types: Type[];
    }, DataType.Metadata, Pick<ComplexType.Metadata, 'additionalFields'>, OpraSchema.MixinType> {
    }
    interface InitArguments extends Combine<{
        kind: OpraSchema.MixinType.Kind;
        types: (ComplexType | MappedType | MixinType)[];
        ctor?: Type;
    }, DataType.InitArguments, MixinType.Metadata> {
    }
}
/**
 * Type definition for MixinType
 * @class MixinType
 */
export interface MixinTypeStatic {
    /**
     * Class constructor of MixinType
     *
     * @param owner
     * @param args
     * @constructor
     */
    new (owner: DocumentElement, args: MixinType.InitArguments): MixinType;
    /**
     * Create a new mixin type from given two types
     * @param types
     * @param options
     */ <A1 extends any[], I1, S1, A2 extends any[], I2, S2>(types: [Class<A1, I1, S1>, Class<A2, I2, S2>], options?: DataType.Options): Class<any[], I1 & I2, S1 & S2>;
    /**
     * Helper method that mixes given types
     * @param types
     * @param options
     */ <A1 extends any[], I1, S1, A2 extends any[], I2, S2, A3 extends any[], I3, S3>(types: [Class<A1, I1, S1>, Class<A2, I2, S2>, Class<A3, I3, S3>], options?: DataType.Options): Class<any[], I1 & I2 & I3, S1 & S2 & S3>;
    /**
     * Helper method that mixes given types
     * @param types
     * @param options
     */ <A1 extends any[], I1, S1, A2 extends any[], I2, S2, A3 extends any[], I3, S3, A4 extends any[], I4, S4>(types: [
        Class<A1, I1, S1>,
        Class<A2, I2, S2>,
        Class<A3, I3, S3>,
        Class<A4, I4, S4>
    ], options?: DataType.Options): Class<any[], I1 & I2 & I3 & I4, S1 & S2 & S3 & S4>;
    /**
     * Helper method that mixes given types
     * @param types
     * @param options
     */ <A1 extends any[], I1, S1, A2 extends any[], I2, S2, A3 extends any[], I3, S3, A4 extends any[], I4, S4, A5 extends any[], I5, S5>(types: [
        Class<A1, I1, S1>,
        Class<A2, I2, S2>,
        Class<A3, I3, S3>,
        Class<A4, I4, S4>,
        Class<A5, I5, S5>
    ], options?: DataType.Options): Class<any[], I1 & I2 & I3 & I4 & I5, S1 & S2 & S3 & S4 & S5>;
    prototype: MixinType;
}
/**
 * Type definition of MixinType prototype
 * @interface
 */
export interface MixinType extends MixinTypeClass {
}
/**
 * @class MixinType
 */
export declare const MixinType: MixinTypeStatic;
/**
 *
 * @class MixinType
 */
declare class MixinTypeClass extends ComplexTypeBase {
    readonly kind: OpraSchema.MixinType.Kind;
    readonly types: (ComplexType | MixinType | MappedType)[];
    extendsFrom(baseType: DataType | string | Type | object): boolean;
    toJSON(options?: ApiDocument.ExportOptions): OpraSchema.MixinType;
    protected _locateBase(callback: (base: ComplexTypeBase) => boolean): ComplexTypeBase | undefined;
}
export {};
