import React, { MutableRefObject } from 'react';
import { Merge } from 'type-fest';
export type DocumentedPropsWithChildren
= P & {
/** Контент */
children?: React.ReactNode;
};
export interface ComponentPropsWithElement {
Element?: keyof JSX.IntrinsicElements;
}
export type WithCustomElementHelper = DocumentedPropsWithChildren ? {
Element?: ET;
} & Omit, 'Element'> : ET extends Extract ? {
Element?: ET;
} & Merge> : CP>;
/**
* Данный интерфейс позволяет создавать компоненты
* с возможностью задавать кастомный HTML-элемент
* либо React-компонент и использовать его свойства.
*/
export interface ComponentWithCustomElement> {
(props: WithCustomElementHelper): ReturnType;
displayName?: string;
}
export type InnerRef = MutableRefObject;
/**
* Тип TupleOf позволяет генерировать кортеж
* из заданного количества элементов
* определенного типа
* (алгоритм с линейной сложностью, можно потенциально
* заменить на логарифмическую, но тип заметно усложнится)
*/
type TupleOfElements = R['length'] extends N ? R : TupleOfElements;
export type TupleOf = N extends number ? TupleOfElements : never;
export {};