interface RequestLike extends RequestInit {
    url: string;
    destination: RequestDestination;
}
interface EmptyRequestInit extends Omit<RequestInit, "body"> {
}
declare namespace EmptyRequest {
    /**
     * Hack to only allow EmptyRequest or Request-like but not any other variant
     */
    interface From extends RequestLike {
        bodyAsText?: undefined;
        bodyAsJson?: undefined;
    }
}
declare class EmptyRequest extends Request {
    #private;
    constructor(input: RequestInfo, init?: EmptyRequestInit);
    static from(from: EmptyRequest.From): Promise<EmptyRequest>;
    get headersAsJson(): Record<string, string>;
    toJSON(): RequestLike;
}
interface TextRequestInit extends Omit<RequestInit, "body"> {
    body: string;
}
declare namespace TextRequest {
    /**
     * Hack to only allow TextRequest or Request-like but not any other variant
     */
    interface From extends RequestLike {
        bodyAsText?: string;
        bodyAsJson?: undefined;
    }
}
declare class TextRequest extends Request {
    #private;
    constructor(input: RequestInfo, init: TextRequestInit);
    static from(from: TextRequest.From): Promise<TextRequest>;
    get headersAsJson(): Record<string, string>;
    get bodyAsText(): string;
    toJSON(): RequestLike;
}
interface JsonRequestInit<T> extends Omit<RequestInit, "body"> {
    body: T;
}
declare namespace JsonRequest {
    /**
     * Hack to only allow JsonRequest<T> or Request-like but not any other variant
     */
    interface From<T> extends RequestLike {
        bodyAsText?: string;
        bodyAsJson?: T;
    }
}
declare class JsonRequest<T> extends Request {
    #private;
    constructor(input: RequestInfo, init: JsonRequestInit<T>);
    static from<T>(from: JsonRequest.From<T>): Promise<JsonRequest<T>>;
    get headersAsJson(): Record<string, string>;
    get bodyAsJson(): T;
    get bodyAsText(): string;
    toJSON(): RequestLike;
}

export { EmptyRequest, type EmptyRequestInit, JsonRequest, type JsonRequestInit, type RequestLike, TextRequest, type TextRequestInit };
