Skip to content

PLASMA-5709: Omit attr title [Dropzone]#2487

Draft
Yakutoc wants to merge 1 commit intodevfrom
PLASMA-5709
Draft

PLASMA-5709: Omit attr title [Dropzone]#2487
Yakutoc wants to merge 1 commit intodevfrom
PLASMA-5709

Conversation

@Yakutoc
Copy link
Collaborator

@Yakutoc Yakutoc commented Feb 10, 2026

Core

Dropzone

  • исключили из типов html атрибут title, чтобы не было пересечения с DropzoneProps['title']

What/why changed

@Yakutoc Yakutoc self-assigned this Feb 10, 2026
@Yakutoc Yakutoc changed the title fix(dropzone): omit attr title [PLASMA-5709] PLASMA-5709: Omit attr title [Dropzone] Feb 10, 2026
@github-actions
Copy link
Contributor

Theme Builder app deployed!

https://plasma.sberdevices.ru/pr/plasma-theme-builder-pr-2487/

*/
onChoseFiles?: FileProcessHandler;
} & InputHTMLAttributes<HTMLInputElement>;
} & Omit<InputHTMLAttributes<HTMLInputElement>, 'title'>;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему для Dropzone нужен RootPropsOmitDraggable

1. Конфликт типов в DropzoneProps

DropzoneProps расширяет InputHTMLAttributes<HTMLInputElement>, в котором есть стандартные HTML-обработчики:

onDrop:      DragEventHandler<HTMLInputElement>   (из InputHTMLAttributes)
onDragEnter: DragEventHandler<HTMLInputElement>
onDragLeave: DragEventHandler<HTMLInputElement>
onDragOver:  DragEventHandler<HTMLInputElement>
title:       string

Dropzone переопределяет их на свои типы:

onDrop:      FileProcessHandler                   (кастомный)
onDragEnter: (event: DragEvent<HTMLDivElement>) => void
onDragLeave: (event: DragEvent<HTMLDivElement>) => void
onDragOver:  (event: DragEvent<HTMLDivElement>) => void
title:       ReactNode

При пересечении через & TypeScript создаёт невозможные типы:

  • title становится string & ReactNode — нельзя передать JSX
  • onDrop становится FileProcessHandler & DragEventHandler — нельзя передать ни то, ни другое

2. Почему Omit не работает

Логичное решение — Omit<InputHTMLAttributes<...>, 'title' | 'onDrop' | ...>. Но ComponentConfig ограничивает LayoutProps:

LayoutProps extends
  | React.HTMLAttributes<HTMLElement>
  | HTMLAttributesWithoutOnChange<HTMLElement>
  | HTMLAttributesWithoutOnChangeAndDefaultValue<HTMLElement>
  | HTMLAttributesWithoutDraggable<HTMLElement>

Omit создаёт новый mapped type, который TypeScript перестаёт считать подтипом HTMLAttributes<HTMLElement>. Цепочка наследования теряется, и mergeConfig выдаёт ошибку TS2345.

3. Почему без Omit компилируется (но некорректно)

Без Omit тип InputHTMLAttributes<HTMLInputElement> остаётся в цепочке &, и TypeScript видит: "он extends HTMLAttributes<HTMLElement> — constraint выполнен". Компиляция проходит, но конфликтующие пропы молча схлопываются в невозможные пересечения.

4. Решение — RootPropsOmitDraggable

В проекте уже есть инфраструктура для таких случаев:

  • HTMLAttributesWithoutDraggableOmit<HTMLAttributes, drag-события>
  • RootPropsOmitDraggable — Root-тип на основе этого Omit
  • Оба явно включены в constraint юнион ComponentConfig и mergeConfig

Это значит, что TypeScript принимает их как валидный LayoutProps. Аналогичный паттерн уже используется в компоненте Tree.

5. Итог

Подход Компиляция Типы корректны
& InputHTMLAttributes (без Omit) Проходит Нет — невозможные пересечения
& Omit<InputHTMLAttributes, ...> Ошибка TS2345
RootPropsOmitDraggable + Pick<InputHTMLAttributes, ...> Проходит Да

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant