Reactjs 为什么是SFC型<;主播>;不可转让给类型SFC<;{}>;?

Reactjs 为什么是SFC型<;主播>;不可转让给类型SFC<;{}>;?,reactjs,typescript,Reactjs,Typescript,下面的代码在由TypeScript编译时抛出一个错误 import React,{SFC}来自“React” 从“反应路由器dom”导入{Link} 从“反应路由器哈希链接”导入{HashLink} 从“markdown to jsx”导入markdown to jsx 界面锚{ baseUrl:字符串 弦 href:string } 警司主播:证监会 ) }else if(props.href.match(/^#/)){ 返回( {props.children} ) }否则{ 返回{props

下面的代码在由TypeScript编译时抛出一个错误

import React,{SFC}来自“React”
从“反应路由器dom”导入{Link}
从“反应路由器哈希链接”导入{HashLink}
从“markdown to jsx”导入markdown to jsx
界面锚{
baseUrl:字符串
弦
href:string
}
警司主播:证监会
)
}else if(props.href.match(/^#/)){
返回(
{props.children}
)
}否则{
返回{props.children}
}
}
常量标记=函数(){
返回(
#这是[降价](降价)
)
}
导出默认降价
/Users/sunknudsen/Sites/sunknudsen/sunknudsen网站/src/Test.tsx
/Users/sunknudsen/Sites/sunknudsen/sunknudsen网站/src/Test.tsx中的类型脚本错误(40,13):
没有与此调用匹配的重载。
重载1/2’(props:Readonly):Markdown’给出了以下错误。
类型“FunctionComponent”不可分配给类型“string | SFC | ComponentClass”。
类型“FunctionComponent”不可分配给类型“SFC”。
参数“props”和“props”的类型不兼容。
类型“{children?:ReactNode;}”不能分配给类型“PropsWithChildren”。
类型“{children?:ReactNode;}”缺少类型“AnchorProps”中的以下属性:baseUrl、relativeUrl、href
重载2/2’(props:MarkdownProps,context?:any):Markdown’给出了以下错误。
类型“FunctionComponent”不可分配给类型“string | SFC | ComponentClass”。
类型“FunctionComponent”不可分配给类型“SFC”。TS2769
38 |覆盖:{
39 | a:{
>40 |部件:锚,
|             ^
41 |道具:{
42 | baseUrl:“/隐私指南”,
43 |相对性:“,

我不明白为什么。

这似乎是对jsx类型定义的
标记的限制

具体而言,
MarkdownToJSX.options.overrides
属于
ComponentOverride
类型,而
ComponentOverride
属于以下类型:

export type ComponentOverride = string | React.ComponentClass | React.SFC | {
    component: string | React.ComponentClass | React.SFC;
    props?: any;
};
该类型不允许您将泛型参数传递给
React.SFC
,这意味着它接受其默认泛型参数:

type SFC<P = {}> = FunctionComponent<P>;

这个问题对特定的库有特殊的影响吗?如果是这样的话,那么它应该被标记为这样。如果不是,那么请考虑将上面的代码编辑成一个可以放入独立IDE中来演示这个问题和唯一的问题。现在有一些缺失的类型定义。(
反应节点
等)我猜这是因为
FunctionComponent

是一种函数类型,其中
P
出现在逆变位置,因此它不是协变的,也就是说
FunctionComponent
不是
FunctionComponent
的子类型,而
B
a
的子类型。但我不知道它是什么在这个代码中使用的类型,所以我不知道这是否是一个完整的答案。这行是A。您可以考虑<代码>(A:A)= > b/COD> <代码> {(A:A):B}的速写形式。
;后一种形式允许您添加其他属性。React函数组件只是一个接受道具并返回React元素的函数。函数参数的作用相反..因此您会得到错误,但我相信jcalz很快会回答:)@sunknudsen创建了一个示例,当我将该示例粘贴到本地文本编辑器中时,该示例将显示错误。如果该示例需要我在本地安装
@types/react
,则该示例没有问题。同样,当我将您的示例粘贴到本地文本编辑器中时,不会出现错误。一个好的示例的代码行数不超过20行。这样做有多容易修复类型定义?请看,我很确定我的
任何
建议都很幼稚。现在转换比较容易。类型定义肯定是可以修复的,但这样做需要时间和知识。更新类型以使其泛型需要理解底层JavaScript,以确保类型可以重新引用ct运行时发生了什么。我确认强制转换是有效的……但这是一个小问题,对吗?@sunknudsen这是一个小问题,但只是一个小问题。
npm
包的类型定义不完整是相当常见的。实用的解决方法是强制转换(带注释)当您知道的比编译器知道的多时。当您有时间/知识更新类型定义时,请先在本地进行更新,然后提交拉取请求。强制转换肯定比使用
@ts ignore
更简单。强制转换必须至少合理(例如,如果没有额外的劝说,按<代码>日期
铸造将不起作用。)
const Markdown = function() {
  return (
    <MarkdownToJSX
      options={{
        overrides: {
          a: {
            component: Anchor,
            props: {
              baseUrl: "/privacy-guides",
              relativeUrl: ""
            }
            // We have tested that this works at runtime,
            // we we know more than the compiler knows.
          } as ComponentOverride
        }
      }}
    >
      # This is [markdown](markdown)
    </MarkdownToJSX>
  );
};