【发布时间】:2021-03-02 01:05:56
【问题描述】:
对于按钮链接组件,我试图根据传递的道具在 HTMLButtonAttributes 或 HTMLAnchorAttributes 之间进行选择。 我对 TypeScript 的了解非常有限。
我有以下类型和接口:
interface CommonButtonProps {
// custom props
}
export interface ButtonProps extends CommonButtonProps,
React.ButtonHTMLAttributes<HTMLButtonElement> {}
export interface ButtonLinkProps extends CommonButtonProps,
React.AnchorHTMLAttributes<HTMLAnchorElement> {
href: string;
}
export type ButtonOrButtonLinkProps = ButtonProps | ButtonLinkProps;
export const isButtonLink = (props: ButtonOrButtonLinkProps,): props is ButtonLinkProps => guard logic
以及以下带有 ButtonOrButtonLinkProps 的 Button 组件:
export const Button: React.FC<ButtonOrButtonLinkProps> = props => {
const buttonLink = isButtonLink(props);
const commonProps = {
};
const linkProps: ButtonLinkProps = {
...commonProps,
onClick: (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
// Do stuff
if (props.onClick) {
props.onClick(event); // Error
}
},
};
const buttonProps: ButtonProps = {
...commonProps,
type: 'button',
onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
// Do other stuff
if (props.onClick) {
props.onClick(event); // Error
}
},
};
return (
<StyledBtn {...(buttonLink ? linkProps : buttonProps)}>
{children}
</StyledBtn>
);
};
以下行引发错误:
if (props.onClick) {
props.onClick(event); // Error
}
'MouseEvent
' 类型的参数不是 可分配给“MouseEvent & MouseEvent '。类型 'MouseEvent ' 不可分配给类型 'MouseEvent '。 “HTMLButtonElement”类型缺少“HTMLAnchorElement”类型的以下属性:字符集、坐标、下载、hreflang 和 19 更多。
为什么HTMLButtonElement的事件类型和MouseEvent的交集是&HTMLAnchorElement的MouseEvent?我有点期待它是一个工会——要么是一个,要么是另一个?
知道如何解决这个问题吗?
【问题讨论】:
-
请在codesandbox中提供您的代码结构
标签: javascript reactjs typescript typescript-generics