import { ToPrimitive } from '../interfaces/to-primitive.interface';
import { StringPrototype } from '../prototypes';
import { ArrayType, FunctionType, NumberType, StringType } from '../types';
import { ReadonlyOrNot } from '../types/primitive.type';
import { TypedArray } from './typed-array.class';
import { TypedBoolean } from './typed-boolean.class';
import { TypedNumber } from './typed-number.class';
import { TypedObject } from './typed-object.class';
/**
 * @todo allow each method's parameter to use TypedClass format
 */
export declare class TypedString<T extends string | number | boolean = ''> extends TypedObject<T> implements Pick<FunctionType.MethodsFrom<String>, 'split' | 'at' | 'concat' | 'trimStart' | 'trimEnd' | 'trim' | 'padEnd' | 'padStart' | 'toLowerCase' | 'toUpperCase' | 'includes' | 'substring' | 'startsWith' | 'endsWith' | 'repeat' | 'indexOf' | 'slice'>, ToPrimitive<T | `${T}`>, Iterable<ArrayType.ElementOf<StringType.Split<`${T}`>>> {
    [n: number]: ArrayType.At<StringType.Split<`${T}`>, number>;
    private readonly string;
    constructor(data?: T);
    [Symbol.iterator](): Iterator<ArrayType.ElementOf<StringType.Split<`${T}`>>, any>;
    /**
     * @inheritdoc
     */
    slice<Start extends number, End extends number>(start?: Start | TypedNumber<Start>, end?: End | TypedNumber<End>): TypedString<ReturnType<typeof StringPrototype.slice<`${T}`, Start, End>>>;
    /**
     * @inheritdoc
     */
    concat<Strings extends ReadonlyOrNot<(string | TypedString<string>)[]>>(...strings: Strings): TypedString<ReturnType<typeof StringPrototype.concat<`${T}`, TypedString.ValueTypes<Strings>>>>;
    /**
     * @inheritdoc
     */
    repeat<Counter extends number = 0>(counter?: Counter | TypedNumber<Counter>): TypedString<StringType.Repeat<`${T}`, Counter>>;
    /**
     * @inheritdoc
     */
    indexOf<SearchString extends string = '', Position extends number = 0>(searchString?: SearchString | TypedString<SearchString>, position?: Position | TypedNumber<Position>): TypedNumber<ReturnType<typeof StringPrototype.indexOf<`${T}`, SearchString, Position>>>;
    /**
     * @inheritdoc
     */
    startsWith<SearchString extends string = '', Position extends number = 0>(searchString?: SearchString | TypedString<SearchString>, position?: Position | TypedNumber<Position>): TypedBoolean<ReturnType<typeof StringPrototype.startsWith<`${T}`, SearchString, Position>>>;
    /**
     * @inheritdoc
     */
    endsWith<SearchString extends string = '', EndPosition extends number = 0>(searchString?: SearchString | TypedString<SearchString>, position?: EndPosition | TypedNumber<EndPosition>): TypedBoolean<ReturnType<typeof StringPrototype.endsWith<`${T}`, SearchString, EndPosition>>>;
    /**
     * @inheritdoc
     */
    substring<Start extends number, End extends number | never = never>(start: Start, end?: End): TypedString<ReturnType<typeof StringPrototype.substring<`${T}`, Start, End>>>;
    /**
     * @inheritdoc
     */
    includes<SearchString extends string = '', Position extends number = 0>(searchString?: SearchString | TypedString<SearchString>, position?: Position | TypedNumber<Position>): TypedBoolean<ReturnType<typeof StringPrototype.includes<`${T}`, SearchString, Position>>>;
    /**
     * @inheritdoc
     */
    toLowerCase(): TypedString<ReturnType<typeof StringPrototype.toLowerCase<`${T}`>>>;
    /**
     * @inheritdoc
     */
    toUpperCase(): TypedString<ReturnType<typeof StringPrototype.toUpperCase<`${T}`>>>;
    /**
     * @inheritdoc
     */
    padStart<TargetLength extends number = StringType.Length<`${T}`>, PadString extends string = ' '>(targetLength?: TargetLength | TypedNumber<TargetLength>, padString?: PadString | TypedString<PadString>): TypedString<ReturnType<typeof StringPrototype.padStart<`${T}`, TargetLength, PadString>>>;
    /**
     * @inheritdoc
     */
    padEnd<TargetLength extends number = StringType.Length<`${T}`>, PadString extends string = ' '>(targetLength?: TargetLength | TypedNumber<TargetLength>, padString?: PadString | TypedString<PadString>): TypedString<ReturnType<typeof StringPrototype.padEnd<`${T}`, TargetLength, PadString>>>;
    /**
     * @inheritdoc
     */
    trim(): TypedString<ReturnType<typeof StringPrototype.trim<`${T}`>>>;
    /**
     * @inheritdoc
     */
    trimEnd(): TypedString<ReturnType<typeof StringPrototype.trimEnd<`${T}`>>>;
    /**
     * @inheritdoc
     */
    trimStart(): TypedString<ReturnType<typeof StringPrototype.trimStart<`${T}`>>>;
    typedLength(): TypedNumber<StringType.Length<`${T}`>>;
    get length(): StringType.Length<`${T}`>;
    /**
     * If a value greater than the length of the current data is given as an index, it is inferred as underdefined that no wrapper exists.
     * @inheritdoc
     */
    at<Index extends number = 0>(index?: Index | TypedNumber<Index>): (Index extends StringType.Length<`${T}`> ? false : [NumberType.Sub<StringType.Length<`${T}`>, Index>] extends [never] ? false : true) extends true ? TypedString<StringType.At<`${T}`, Index>> : undefined;
    /**
     * type-safe split.
     *
     * @inheritdoc
     */
    split<Splitter extends string = '', Limit extends number = 0>(splitter?: Splitter | TypedString<Splitter>, limit?: Limit | TypedNumber<Limit>): TypedArray<ReturnType<typeof StringPrototype.split<`${T}`, Splitter, Limit>>>;
    toPrimitive(): T;
    toPrimitive(): `${T}`;
}
export declare namespace TypedString {
    /**
     * Inference of value type.
     */
    type ValueType<Pointer extends TypedString<any> | string> = Pointer extends TypedString<infer T> ? `${T}` : Pointer extends string ? Pointer : never;
    /**
     * Inference of value types.
     */
    type ValueTypes<Pointers extends ReadonlyOrNot<(TypedString<any> | string)[]>> = Pointers extends [
        infer F extends TypedString<infer T> | string,
        ...infer Rest extends ReadonlyOrNot<(TypedString<any> | string)[]>
    ] ? [TypedString.ValueType<F>, ...TypedString.ValueTypes<Rest>] : [];
}
//# sourceMappingURL=typed-string.class.d.ts.map