Поскольку вы собираетесь рассматривать теги как строку, вы можете использовать React.createElement
. Внутри render
напишите следующее:
const element = React.createElement(this.getMarkup(), {}, 'Hello');
return <>{element}</>;
По сути, createElement
ожидает тип элемента в виде строки, поэтому вы можете передать 'h1'
, не мешая при этом TypeScript.
Более того, вы можете видеть, что я передаю пустой массив в качестве второго аргумента: там вы можете передавать любые реквизиты, такие как style
, onClick
, ... Обычно в этом случае вы должны написать следующее:
const element = React.createElement(this.getMarkup(), {{...this.props}}, 'Hello');
Но, конечно, вам нужно будет добавить правильные типы в Text
реквизит, используя React.HTMLProps<T>
.. Примерно так:
class App extends React.Component<React.HTMLProps<HTMLHeadingElement | HTMLParagraphElement>, IState> {`
Где в этом случае я рассматриваю только h
и p
элементов.
РЕДАКТИРОВАТЬ: Если вы собираетесь объединить HTMLProps
с вашими реквизитами, такими как IProps
, то вы будете писать IProps & React.HTMLProps<HTMLHeadingElement | HTMLParagraphElement>
.
В этот момент внутри this.props
у вас будут (p
| h
) реквизиты И реквизиты, определенные внутри IProps
.
Затем, в с этой точки зрения, поскольку элемент p
и h
не должен принимать реквизиты, поступающие с IProps
, вам следует переписать createElement
следующим образом:
// Assuming you have this IProps
interface IProps {
tag: string;
myProp: number;
}
// Inside render
const { tag, myProp, ...otherProps } = {...this.props};
const element = React.createElement(this.getMarkup(), otherProps, 'Hello');
return <>{element}</>;