Comments (2)
I could fix it.
The problem is the type of ComponentType
.
From React's typings:
type ComponentType<P = {}> = ComponentClass<P> | FunctionComponent<P>;
interface ComponentClass<P = {}, S = ComponentState> extends StaticLifecycle<P, S> {
new (props: P, context?: any): Component<P, S>;
// ...
}
interface FunctionComponent<P = {}> {
(props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
}
type PropsWithChildren<P> = P & { children?: ReactNode };
Thus ComponentClass
does not have a children
prop, while FunctionComponent
does always.
If the children prop is needed, the as
prop must be a function component or a class component, but then it needs to have a children
prop.
Full code below:
type GetRenderComponentProps<T, P> = T extends React.ComponentType<React.PropsWithChildren<P>> | typeof Link
? React.ComponentProps<T>
: T extends 'a'
? React.HTMLProps<T>
: {};
type RenderComponent<P = {}> = React.ComponentType<React.PropsWithChildren<P>> | typeof Link | 'a';
type Props<E extends RenderComponent, P = {}> = {
as?: E;
} & GetRenderComponentProps<E, P>;
const Button = <T extends RenderComponent>({ as, children, ...props }: Props<T>): ReturnType<React.FC<Props<T>>> => {
return (
<ChakraButton as={as} {...props}>
{children}
</ChakraButton>
);
};
export default Button;
from duncanleung.com.
Hi @asterikx, thanks for the detailed write up!
I will investigate this. Thanks for the information!
from duncanleung.com.
Related Issues (2)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from duncanleung.com.