React 无状态组件的 TypeScript 返回类型是什么?

IT技术 reactjs typescript
2021-04-21 01:10:07

这里的返回类型是什么?

const Foo
  : () => // ???
  = () => (
    <div>
      Foobar
    </div>
  )
6个回答

StatelessComponent此答案中提到的类型已被弃用,因为在引入 Hooks API 后,它们并不总是无状态的。

一个函数组件是有类型的React.FunctionComponent,它有一个别名React.FC来保持简洁。

它有一个必需的属性,一个函数,它将返回一个ReactElementnull它有几个可选的属性,如propTypescontextTypesdefaultPropsdisplayName

下面是一个例子:

const MyFunctionComponent: React.FC = (): ReactElement => {
  return <div>Hello, I am a function component</div>
}

以下是来自@types/react 16.8.24 的类型:

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

interface FunctionComponent<P = {}> {
    (props: PropsWithChildren<P>, context?: any): ReactElement | null;
    propTypes?: WeakValidationMap<P>;
    contextTypes?: ValidationMap<any>;
    defaultProps?: Partial<P>;
    displayName?: string;
}
interface ISomeCoolInterface {
   some: 'string';
   cool: 'string';
   props: 'string' 
}    

const SomeCoolComponent
    : React.FC<ISomeCoolInterface> 
    = ({ some, cool, props }): JSX.Element => {
        return <SomeCoolComponent>{some, cool, props}</SomeCoolComponent>      
    }

这里重要的一点是返回类型 JSX.Element

YesReactElement是较新支持的返回类型。我在搬到这里时看到了这种变化eslint
2021-06-03 01:10:07
另一位海报说它是 ReactElement - 是首选,还是取决于环境/TS 版本?
2021-06-04 01:10:07

此处正确的返回类型是ReactElement<P>,但更好的选择是React.StatelessComponent<P>像这样使用

const Foo
  : React.StatelessComponent<{}>
  = () => (
    <div>
      Foobar
    </div>
  )
React.StatelessComponent 已被弃用,这意味着 React.FC 是组件的正确类型。该函数将返回一个 ReactElement。as of recent React versions, function components can no longer be considered 'stateless'. Please use FunctionComponent instead.
2021-06-19 01:10:07
这是过时的
2021-06-22 01:10:07

如果使用function关键字,最好的返回类型似乎是JSX.Element | null

目前我们的团队使用 JSXNode 作为简写,因为只有这两种类型可以直接作为 JSX 结果返回:

type JSXNode = JSX.Element | null;

编辑:看起来 React.ReactNode 最终是 JSX 的预期返回类型,但目前不可能。参考


背景:

这里的答案似乎都没有解决最常见的现代情况 - 您有一个返回元素的函数。这应该返回什么类型?

function MyComponent(): SomeTypeHere {
  return <>...</>;
}

隐藏组件的推荐方法是返回 null,因此不清楚返回类型是什么。输入 JSX.Element | null 无处不在,甚至制作这样的自定义类型似乎没有必要考虑到这种情况的普遍性。ReactNode 也不起作用,因为 undefined 不能作为 JSX 返回。

总的来说,最好的返回类型似乎是JSX.Element | null. FC如果您不使用function关键字,则这是使用类型的返回类型

const MyComponent: FC = () => { <>...</> }

我还要添加.SFC,它代表无状态功能组件。

const Foo
  : React.SFC<{}>
  = () => (
    <div>
      Foobar
    </div>
  )