I am working on a TypeScript + React project. For a component, I want to use the polymorphic as prop. However, I want to restrict it to HTML tags so it will not accept ReactNodes or JSX Elements. But I do not know which type I can use to achieve this.
<Foo as="section">...</Foo> ✅
<Foo as={SomeOtherComponent}>...</Foo> ❌
I have tried using React.ElementType but that still looks to accept other components.
interface Foo {
as?: React.ElementType
}
Which type could I use to accept only HTML tags but not other elements or nodes?
You could accept only a string, not a function:
interface Foo {
as?: string;
}
Or you could more specifically accept only known HTML tag names using a string literal union; you don't have to write out the names yourself, you can get them from HTMLElementTagNameMap in lib.dom.d.ts:
interface Foo {
as?: keyof HTMLElementTagNameMap; // This is "a" | "abbr" | "address" ...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With