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 {};