import type { Path } from "../parent/pathTypes";
import type { AnyStandardType } from "./schemas";
import { TypeCheckError } from "./TypeCheckError";
declare type CheckFunction = (value: any, path: Path) => TypeCheckError | null;
declare type CheckResult = TypeCheckError | null;
/**
 * @ignore
 */
export declare function invalidateCachedTypeCheckerResult(obj: object): void;
/**
 * @ignore
 */
export declare class TypeChecker {
    private readonly _check;
    readonly getTypeName: (...recursiveTypeCheckers: TypeChecker[]) => string;
    private checkResultCache?;
    unchecked: boolean;
    private createCacheIfNeeded;
    setCachedResult(obj: object, newCacheValue: CheckResult): void;
    invalidateCachedResult(obj: object): void;
    private getCachedResult;
    check(value: any, path: Path): TypeCheckError | null;
    private _cachedTypeInfoGen;
    get typeInfo(): TypeInfo;
    constructor(_check: CheckFunction | null, getTypeName: (...recursiveTypeCheckers: TypeChecker[]) => string, typeInfoGen: TypeInfoGen);
}
declare const lateTypeCheckerSymbol: unique symbol;
/**
 * @ignore
 */
export interface LateTypeChecker {
    [lateTypeCheckerSymbol]: true;
    (): TypeChecker;
    typeInfo: TypeInfo;
}
/**
 * @ignore
 */
export declare function lateTypeChecker(fn: () => TypeChecker, typeInfoGen: TypeInfoGen): LateTypeChecker;
/**
 * @ignore
 */
export declare function isLateTypeChecker(ltc: any): ltc is LateTypeChecker;
/**
 * Type info base class.
 */
export declare class TypeInfo {
    readonly thisType: AnyStandardType;
    constructor(thisType: AnyStandardType);
}
/**
 * @ignore
 */
export declare type TypeInfoGen = (t: AnyStandardType) => TypeInfo;
export {};
