【发布时间】:2021-10-09 01:26:04
【问题描述】:
我有一个第三方库可以像这样导出 React 组件:
// Code I can not change
export default class MyIcon extends React.Component {
...
};
MyIcon.propTypes = {
color?: PropTypes.String
}
我正在使用 Typescript,所以我为这个模块做了定义:
// Code I can change
declare module '@thirdparty/MyIcon' {
import React from 'react';
interface Props {
color?: string
}
const Icon: React.FC<Props>;
export default Icon;
现在,有一个 typescript 组件具有这种结构:
// Code I can not change
interface IButton {
icon?: React.Component,
text: string
}
export default const Button: FC<IButton> = ({ icon, text }) => {...}
在我想使用 MyIcon 组件并将其传递给 Button 组件之前,一切正常。我得到的错误是Type React.FC<Props> is incompatible with Component<{}, {}, {}>
我最终这样做了:
<Button icon={myIcon as unknown as Component} />
但让我感到沮丧的是不知道为什么会失败。
回答
在与第三方库的创建者交谈后,我发现他们将类型设置为组件,因为他们需要在内部进行更改。但是这样做,他们迫使我的另一个第三方库表现得像一个类而不是一个 ReactNode。所以基本上输入图标将适用于第三方库之一,但它不允许我在我的项目中使用另一个第三方库,请参见下面的代码:
// Ok Code
<Button icon={MyIcon}>Works</Button>
// Wrong Code
<div><MyIcon /> Error on Typescript</div>
显然问题不在于类型,而在于第三方库之一要求图标是组件而不是 ReactNode 的方式。就我而言,这对我来说是一个完整的问题。希望这对某人有所帮助。
【问题讨论】:
-
你可以直接使用
icon: typeOf MyIcon。让我知道这是否有效。 -
你在哪里使用了模块中定义的
Icon可以更改? -
这只是类型的声明。所以,我只是想使用 2 个库。一个库是 Icon 库,第二个库是接收 Icon 作为道具的组件。这两个库都是第三方库。
标签: javascript reactjs typescript types