打字稿,样式组件错误:TS2769:没有重载匹配此调用。重载 1 of 2

Posted

技术标签:

【中文标题】打字稿,样式组件错误:TS2769:没有重载匹配此调用。重载 1 of 2【英文标题】:Typescript, styled-component error: TS2769: No overload matches this call. Overload 1 of 2 【发布时间】:2021-01-26 05:36:55 【问题描述】:

这是我的 styledComponent:

const stopPropagation = (event: Event): void => 
  event.stopPropagation();
;

<StyledComp onClick=stopPropagation> //error occurs here
    hi StyledComp
</StyledComp>

这就是我的定义:

export type Prop = 
  onClick: (event: Event) => void;
;

export const StyledComp = styled.div<Prop>`
  display: flex;
`;

但它会返回如下错误:

TS2769:没有重载匹配此调用。重载 1 of 2, '(props: Pick, "title" | "slot" | ... 252 更多 ... | "is"> & ...; & StyledComp, "title" | ... 254 更多 ... | "is"> & Partial<...>, "title" | ... 254 更多 ... | "is"> & ... ; & ...; ): ReactElement<...>',给出以下错误。类型 '(event: Event) => void' 不可分配给类型 '((event: MouseEvent) => void) & ((event: Event) => void)'。类型 '(event: Event) => void' 不可分配给类型 '(event: MouseEvent) => void'。参数 'event' 和 'event' 的类型不兼容。类型“MouseEvent”不可分配给类型“事件”。属性“目标”的类型不兼容。类型“EventTarget”中缺少属性“值”,但类型“ value: string; '。重载 2 of 2, '(props: StyledComponentPropsWithAs): ReactElement, string | ... 1 更多 ... | (new (props: any) => Component<...>)>',给出了以下错误。类型 '(event: Event) => void' 不可分配给类型 '((event: MouseEvent) => void) & ((event: Event) => void)'。类型 '(event: Event) => void' 不可分配给类型 '(event: MouseEvent) => void'。

注意:您可以找到 styled-component&Typescript 文档here!

编辑:

这是事件类型:

export type Event = 
  target: 
    value: string;
  ;
  stopPropagation: () => void;
  preventDefault: () => void;
;

【问题讨论】:

我不确定 Event 到底是什么,但 AFAIK 没有这样的内置静态类型。因此,如果您没有手动定义,则必须改用React.MouseEvent 我手动定义的,和 React.MouseEvent 一样。 哦,也许我对事件类型有误。让我调查一下,也许是问题所在 【参考方案1】:

错误信息的重要部分是

类型 '(event: Event) => void' 不可分配给类型 '(event: MouseEvent) => void'

所以样式化 div 的 onClick 属性具有 (event: MouseEvent&lt;htmlDivElement, MouseEvent&gt;) =&gt; void 类型,并且您想为其分配 (event: Event) =&gt; void 类型的函数,但这不起作用,因为类型不兼容。

你应该改写:

const stopPropagation = (event: MouseEvent<HTMLDivElement, MouseEvent>): void => 
  event.stopPropagation();
;

【讨论】:

谢谢,我添加了这个类型:React.MouseEvent 并且成功了。 只是想为这个正确答案添加一点注释。只要您像这样从反应中导入 MouseEvent,这个答案就是正确的:import MouseEvent from 'react'。用于限制性事件处理的 MouseEvent 是不必要且毫无意义的,因此如果您想使用限制性方法,您可以这样做:MouseEvent&lt;HTMLElement&gt; 或者对于一般用途,您可以简单地单独使用 MouseEvent

以上是关于打字稿,样式组件错误:TS2769:没有重载匹配此调用。重载 1 of 2的主要内容,如果未能解决你的问题,请参考以下文章

打字稿路由错误 - 没有重载匹配此调用

从 makeStyles 切换到 mui5 sx 道具-打字稿错误(没有重载匹配此调用)传递具有位置的对象

Vue watch TypeScript错误TS2769:没有重载匹配这个调用

没有重载匹配此调用。 React 中的 Typescript 和 StyledComponents

Vue-Router4/TypeScript“没有重载匹配这个调用”

打字稿样式组件错误:“类型'孩子:字符串;'与类型'IntrinsicAttributes'没有共同的属性。”