Как передать className в пользовательский тег `h${headingLevel}`

Я создаю пользовательский компонент с заголовком динамического уровня:

const HeadingTag = `h${headingLevel}`;
...
<HeadingTag className='heading'>
  {headingText}
</HeadingTag>

Однако я получаю следующую ошибку:

error TS2322: Type '{ children: string; className: string; }' is not assignable to type 'IntrinsicAttributes'.
  Property 'children' does not exist on type 'IntrinsicAttributes'.

Как я могу передать атрибуты HTML по умолчанию в пользовательские теги, которые разрешаются в теги HTML по умолчанию?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

К сожалению, машинописный текст не может понять, что h${headingLevel} будет оцениваться как один из тегов h (если бы headingLevel был подходящим объединением числовых или строковых литералов, машинописный текст просто не имеет для этого механизма).

Самое простое решение в этом случае, поскольку у нас больше информации, чем у компилятора, — это использовать утверждение типа, чтобы машинописный текст знал, что HeadingTag будет 'h1' | 'h2' | 'h3' | 'h4' | 'h5'| 'h6':

const HeadingTag = `h${headingLevel}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5'| 'h6';
<HeadingTag className='heading'>
    {headingText}
</HeadingTag> 

Другие вопросы по теме