Тип расширения ReactTS с помощью динамических реквизитов компонентов?

Возможно ли иметь компонент React, который может динамически определять, какие реквизиты у него есть?

Пример:

type BaseType = {
   baseProp?: ...
   as?: ...
}

type Extended = {
   extendedProp?: ...
}

<Base /> // expected props => { baseProp }
<Base as = {ExtendedComponent} extendedProp = {...} /> // expected props => { baseProp, extendedProp } 
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Взяв пример из ответа это, мы можем, используя пересечения, сначала вывести тип реквизита из as, а затем использовать эти реквизиты для проверки любых дополнительных свойств:

type BaseType = {
  baseProp?: number
}

type Extended = {
  extendedProp?: string
}

declare const ExtendedComponent: React.FC<Extended>
function Base<T = {}>(p: BaseType & { as? : React.ComponentType<T>} & T): React.ReactElement{
  if (p.as) {
    const Child = p.as;
    return <div>{p.baseProp}<Child {...p as T}></Child></div>
  }else {
    return <div>{p.baseProp}</div>
  }
}


let s = <Base /> // expected props => { baseProp }
let a = <Base as = {ExtendedComponent} extendedProp = "a" /> 

Вау... пытался добиться этого часами... :D. Думал, что есть решение, так как это можно обработать во время компиляции. Большое спасибо!

Istvan Orban 21.05.2019 13:42

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

Похожие вопросы

У меня возникла ошибка при попытке обновить данные из firestore "FirebaseError: Function CollectionReference.doc()"
Закрыть всплывающее окно при отправке формы и отобразить сообщение об успехе/ошибке в родительском компоненте в reactjs
Как обрабатывать в компоненте класса дополнительные параметры, переданные от родительского к дочернему обработчику событий
Показать один объект из полученных данных undefined
Ограничение фильтра до 3 символов
DraftJS getBlocksAsArray() возвращает массив массива в производстве, но только массив в dev (и работает)
Создайте докер с ошибкой приложения реакции
Всплывающее окно пользовательского интерфейса материала выбрасывается в верхний левый угол при использовании на встроенной кнопке в таблице с уникальным ключом
Как сравнить значение запроса с URL-адреса на идентификатор, используя реакцию?
Реагировать на собственные данные формы сообщения с объектом и файлом в нем, используя axios