declare global {
    /**
     * Общие утилиты
     */
    namespace Api {
        /**
         * Интерфейс `paths` в схеме openAPI
         *
         * Общий интерфейс для разных API
         *
         * В данной реализации строго не типизирован
         *
         * @see https://learn.openapis.org/specification/structure.html
         * @see https://spec.openapis.org/oas/v3.1.0#paths-object
         */
        type PathsAbstract = Record<string, any>;
        type PathAbstract = `/${string}` | '';
        /**
         * Путь метода API
         *
         * Определяет возможные значения пути метода API
         *
         * @template T Интерфейс `paths` в схеме openAPI
         *
         * @see Api.PathsAbstract
         */
        type Path<T extends Api.PathsAbstract> = Extract<keyof T, string>;
        /**
         * Создает новый тип на основе T с заменой типа свойства K на NewType, только если ключ K присутствует в T.
         *
         * Если ключа нет — возвращается пустой объект.
         *
         * Используется для расширения простых типов такими же, но с дженериками
         */
        type PickAndRetype<T extends object, K extends PropertyKey, NewType> = K extends keyof T ? undefined extends T[K] ? {
            [P in K]?: NewType;
        } : {
            [P in K]: NewType;
        } : {};
        type PropIfExists<T, K extends PropertyKey> = K extends keyof T ? T[K] : never;
        /**
         * Сужение возможных значений массива
         */
        type ArrowNarrow<T extends readonly any[], FieldsNarrow extends readonly any[]> = Extract<T[number], FieldsNarrow[number]>[] & T;
        /**
         * Утилита для условной установки типа по входным условиям
         */
        type IfAllTrue<T extends boolean[], Then, Else = never> = false extends T[number] ? Else : Then;
    }
}
export {};
