import 'reflect-metadata';
import type { Combine, Type } from 'ts-gems';
import { type Validator } from 'valgen';
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 { DataType } from './data-type.js';
import { EnumType } from './enum-type.js';
import type { MappedType } from './mapped-type.js';
import type { MixinType } from './mixin-type.js';
import type { SimpleType } from './simple-type.js';
import type { UnionType } from './union-type.js';
/**
 * @namespace ArrayType
 */
export declare namespace ArrayType {
    interface Metadata extends Combine<{
        kind: OpraSchema.ArrayType.Kind;
        name?: string;
        type: Type;
    }, DataType.Metadata, OpraSchema.ArrayType> {
    }
    interface InitArguments extends Combine<{
        kind: OpraSchema.ArrayType.Kind;
        type: ArrayType | ComplexType | EnumType | MappedType | MixinType | SimpleType | UnionType;
        ctor?: Type;
    }, DataType.InitArguments, ArrayType.Metadata> {
    }
    interface Options extends Combine<Pick<OpraSchema.ArrayType, 'minOccurs' | 'maxOccurs'>, DataType.Options> {
    }
}
/**
 * Type definition for ArrayType
 * @class ArrayType
 */
export interface ArrayTypeStatic {
    /**
     * Class constructor of ArrayType
     *
     * @param owner
     * @param args
     * @constructor
     */
    new (owner: DocumentElement, args: ArrayType.InitArguments): ArrayType;
    /**
     * Create a new mixin type from the given data type
     */
    (type: string | Type | EnumType.EnumObject, options?: ArrayType.Options): Type;
    prototype: ArrayType;
}
/**
 * Type definition of ArrayType prototype
 * @interface
 */
export interface ArrayType extends ArrayTypeClass {
}
/**
 * @class ArrayType
 */
export declare const ArrayType: ArrayTypeStatic;
/**
 *
 * @class ArrayType
 */
declare class ArrayTypeClass extends DataType {
    readonly kind: OpraSchema.ArrayType.Kind;
    readonly type: ComplexType | MixinType | MappedType | SimpleType | UnionType | EnumType | ArrayType;
    readonly minOccurs?: number;
    readonly maxOccurs?: number;
    toJSON(options?: ApiDocument.ExportOptions): OpraSchema.ArrayType;
    generateCodec(codec: 'encode' | 'decode', options?: DataType.GenerateCodecOptions, properties?: object): Validator;
    extendsFrom(): boolean;
    protected _locateBase(): ArrayType | undefined;
}
export {};
