在@types/react
中,全局JSX
命名空间已被弃用:
declare global {
/**
* @deprecated Use `React.JSX` instead of the global `JSX` namespace.
*/
namespace JSX {
...
}
}
由于我启用了ESLint的deprecation/deprecation
规则(来自eslint-plugin-deprecation
插件),我现在收到了如下函数组件返回类型的错误:
export default function TestComponent(): JSX.Element { // This JSX is marked as deprecated
return (
<span>Test</span>
);
}
在这种情况下,既然全局JSX
命名空间已被弃用,那么JSX.Element
的正确返回类型替换是什么?
是否是React.JSX.Element
,如弃用消息中所述:
export default function TestComponent(): React.JSX.Element { ... }
ReactElement
是这样的:
import { ReactElement } from "react";
export default function TestComponent(): ReactElement { ... }
或者最好使用React.FC
声明函数组件,并让TypeScript像这样推断返回类型:
export const TestComponent: React.FC = () => { ... };
1条答案
按热度按时间olqngx591#
直接使用
React.ReactElement
(或者更精确地说,React.ReactElement | null
):这正是
React.FC
所执行的(不再推荐):它也是
JSXElementConstructor
的定义:也就是说,除非你有一些规则强迫你输入你的函数组件返回类型,否则你可以为了简单而省略它:
显然,该函数现在可以返回任何内容,并且TypeScript不会抱怨......除非您尝试将其用作JSX模板中的函数组件,如fb/cra#8177中所指出的:
我真正看到
React.FC
[...]的唯一好处是它指定了返回类型,这会捕获错误[...]在实践中,我认为这是好的,因为一旦你尝试使用它,它就会被捕获: