React + Typescript:没有状态/没有道具的React组件的类型

job*_*bmo 10 typescript reactjs

我已经看过使用Typescript的React组件的多个示例:

class Foo extends React.Component<IProps, IState> {}

当我们不使用道具或国家时,似乎没有明确的约定.

人设这些类型any,null,undefined,{},void,etc.This就是我迄今为止看到:

  1. class Foo extends React.Component<null, null> {}
  2. class Foo extends React.Component<any, any> {}
  3. class Foo extends React.Component<{}, {}> {}
  4. class Foo extends React.Component<undefined, undefined> {}
  5. class Foo extends React.Component<void, void> {}
  6. class Foo extends React.Component<object, object> {}

这样做的最佳方式是什么?

更新:

简单地说 - class Foo extends React.Component {}因为道具和州被初始化为{}

Leo*_*one 10

作为回答这个问题,你可以使用React.FC<{}>

const MyStatelessComponent : React.FC<{}> = props =>
    <div>{props.children}</div>
Run Code Online (Sandbox Code Playgroud)

或者,如果您的标记变大:

const MyStatelessComponent : React.FC<{}> = props => {

    {/*  Some code here */}
    return <div>{props.children}</div>

}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 TS 并且它抱怨 `FC&lt;{}&gt;`,您可以将其简化为 `FC`,而无需尖括号和大括号。工作示例: `const MyComponent: FC = () =&gt; { /* 这里是代码和 tsx */ }` (2认同)

job*_*bmo 9

来自https://github.com/DefinitelyTyped/DefinitelyTyped/blob/15b7bac31972fbc081028937dfb1487507ca5fc9/types/react/index.d.ts#L199-L200

interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { }
Run Code Online (Sandbox Code Playgroud)

道具和状态初始化为{},因此对于没有状态或道具的组件,我们可以简单地执行:

class Foo extends React.Component {} 
Run Code Online (Sandbox Code Playgroud)


Ula*_*nka 8

您可以用于VoidFunctionComponent无状态和无道具组件(没有状态和道具):

const MyComponent: React.VoidFunctionComponent = () => {
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • React 18 中已弃用“React.VoidFunctionComponent” (2认同)

soy*_*wod 7

根据这个指南和我的exp,我会说:

  1. class Foo extends React.Component<null, null> {} 当你知道你不会接受道具或陈述
  2. class Foo extends React.Component<any, any> {} 当你知道你会收到道具和状态,但你真的不在乎它们的样子
  3. class Foo extends React.Component<{}, {}> {} 从未见过,似乎很奇怪
  4. class Foo extends React.Component<undefined, undefined> {}同样的null,这取决于你.我经常看到nullundefined
  5. class Foo extends React.Component<void, void> {} 坏主意,因为似乎是为函数返回保留(当你不期望一个)

欢迎其他意见