Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(CollapseGroup): get rid of additional generics in component types #1377

Closed
wants to merge 1 commit into from

Conversation

nekitk
Copy link
Collaborator

@nekitk nekitk commented Jul 26, 2021

Описание изменений

Чек-лист

  • PR: направлен в правильную ветку
  • PR: назначен исполнитель PR и указаны нужные лейблы
  • PR: проверен diff, ничего лишнего в PR не попало
  • PR: прилинкованы затронутые issue и связанные PR
  • PR: есть описание изменений
  • JS: нет варнингов и ошибок в консоли браузера
  • Тесты: новый функционал и исправленные баги покрыты тестами
  • Документация: отражены все изменения в API компонентов и описаны важные особенности реализации или использования
  • Сторибук: для компонентов написаны или обновлены stories
  • Верстка: используются переменные
  • Верстка: проверена с разным количеством контента

Опционально

  • Доработки: заведены задачи для дальнейшей работы, если что-то решено не править в текущем пулл-реквесте
  • Коммиты: проименованы в соответствии с правилами

@nekitk nekitk self-assigned this Jul 26, 2021
@vercel
Copy link

vercel bot commented Jul 26, 2021

This pull request is being automatically deployed with Vercel (learn more).
To see the status of your deployment, click below or on the icon next to each commit.

🔍 Inspect: https://vercel.com/consta/consta-uikit/AhvbmVzCxgmfTjbY1u4DQRidFmpm
✅ Preview: Failed

[Deployment for bbe62f4 failed]

@@ -163,7 +163,7 @@
"ts-essentials": "^3.0.0",
"ts-jest": "^25.4.0",
"ts-node": "^8.8.2",
"typescript": "3.9.9",
"typescript": "4.3.5",
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Чтобы заработала сборка, придётся обновить react-scripts и всё, что с ними связано

getItemRightSide?: never;
}
),
HTMLDivElement
> &
(ITEM extends { label: DefaultItem['label'] }
? {}
? { getItemLabel?: never }
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Чтобы TS мог правильно определять, по какой ветке условия мы движемся, приходится добавлять явно исключать пропы из другой ветки с помощью never

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

В этом месте типы отличаются от того, что было раньше. Теперь если в item есть label, то getItemLabel вообще нельзя будет указывать.

Сделать так, чтобы getItemLabel был опциональным к сожалению не вышло.

Copy link
Collaborator Author

@nekitk nekitk Jul 27, 2021

Choose a reason for hiding this comment

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

Возможно, стоит подумать всё-таки отказаться от подхода с геттерами и требовать на входе данные в определённом формате. А подготовку этих данных производить снаружи мапперами.

Нее, маперами не удобно((
Лучше попытаться оставить и с геттерами и без них. Пусть даже если потребуется приведениями типов заниматься, кажется убирать функционал для того чтобы угодить TS - не стоит.

Copy link
Collaborator

Choose a reason for hiding this comment

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

В этом месте типы отличаются от того, что было раньше. Теперь если в item есть label, то getItemLabel вообще нельзя будет указывать.

Сделать так, чтобы getItemLabel был опциональным к сожалению не вышло.

Это плохо(( обьект может соделжать label, и при этом имя можно взять из какогонибуть name

(
| {
iconPosition?: 'left';
getItemRightSide?: CollapseGroupPropGetItemRightSide<ITEM>;
}
| {
iconPosition?: 'right';
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

тут TS путался из-за того, что в обоих ветках iconPosition был опциональным и поэтому он не мог понять, по какой ветке мы идём, когда ничего не указано

return useChoiceGroupIndexed(
props.isAccordion
? {
value: (openedKeys as typeof props.opened) ?? null,
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

после проверки props.isAccrodion у props.opened выводится правильный тип

closeIcon?: never;
directionIcon?: CollapseIconPropDirection;
closeDirectionIcon?: CollapseIconPropDirection;
isAccordion?: false;
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Обновление до TS 4 нужно, чтобы TS правильно определял ветку типов с опциональным дискриминантом (в нашем случае это isAccordion?). В TS 3 придётся делать все дискриминанты обязательными полями: isAccordion, iconPosition и возможно даже closeIcon, getItemLabel и getItemContent, а это усложнит использование компонента снаружи.

Кажется, стоит потратить сейчас время на обновление, чтобы впредь было проще работать с такими кейсами.

Copy link
Collaborator Author

@nekitk nekitk Jul 28, 2021

Choose a reason for hiding this comment

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

Вообще в TS 4.3 появилось выведение типов для дженериков, так что, возможно, там получится подтюнить код компонента, избавившись от ручных тайпгардов и не меняя сами типы.

microsoft/TypeScript#43183

@nekitk
Copy link
Collaborator Author

nekitk commented Aug 10, 2021

Обсудили и решили, что стоит в ближайшем будущем перейти на TS 4.3

Плюсы из этого пр-а не перевешивают накладываемые ограничения, так что закрываю

@nekitk nekitk closed this Aug 10, 2021
@gizeasy gizeasy deleted the wip-ts-problem branch March 3, 2023 08:15
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.

2 participants