I want to wrap up my ant-design components with styled-components, I know that this is possible (https://gist.github.com/samuelcastro/0ff7db4fd54ce2b80cd1c34a85b40c08) however I'm having troubles to do the same with TypeScript.
This is what I have so far:
import { Button as AntButton } from 'antd';
import { ButtonProps } from 'antd/lib/button/button';
import styledComponents from 'styled-components';
interface IButtonProps extends ButtonProps {
customProp: string;
}
export const Button = styledComponents<IButtonProps>(AntButton)`
// any custom style here
`;
As you can see I'm defining my ant-design button with as any
in order to make it work, otherwise I get some incompatible types like:
Argument of type 'typeof Button' is not assignable to parameter of
type 'ComponentType<IButtonProps>'.
Type 'typeof Button' is not assignable to type
'StatelessComponent<IButtonProps>'.
Types of property 'propTypes' are incompatible.
Property 'customProp' is missing in type '{
type: Requireable<string>;
shape: Requireable<string>;
size: Requireable<string>;
htmlType: Requireable<string>;
onClick: ...
etc
}
Thank you.
Solution:
import { Button as AntButton } from 'antd';
import { NativeButtonProps } from 'antd/lib/button/button';
import * as React from 'react';
import styledComponents from 'styled-components';
export const Button = styledComponents<NativeButtonProps>(props => <AntButton {...props} />)`
// custom-props
`;
I have found this ancient question and try to solve in an easy way:
without render props :D
if you just need wrap a component as function component, that's all right. But you will lose the properties of class component such as
Card.Meta
.There is a workaround:
Everything (maybe... XD) works as original Antd Component ;)
The above solutions didn't work for me, this solved it though.
The root of the problem seems to be that
styled-components
expects the inner component (AntButton
) to accept all the props in the specified interface (IButtonProps
), butAntButton
does not acceptcustomProp
. To fix this, follow the last example in this section of the documentation and use a stateless function component to removecustomProp
before callingAntButton
.index.tsx (Button Component)