J'ai vu plusieurs exemples de composants React utilisant TypeScript:
class Foo extends React.Component<IProps, IState> {}
Il semble qu'il n'y ait pas de convention claire lorsque nous n'utilisons ni les accessoires ni l'État.
Les personnes définissent ces types comme suit: any
, null
, undefined
, {}
, , etc.C'est ce que j'ai vu jusqu'à présent:void
class Foo extends React.Component<null, null> {}
class Foo extends React.Component<any, any> {}
class Foo extends React.Component<{}, {}> {}
class Foo extends React.Component<undefined, undefined> {}
class Foo extends React.Component<void, void> {}
class Foo extends React.Component<object, object> {}
Quelle est la meilleure façon de le faire?
Mise à jour:
Accessoires:
void
ne peut pas être utilisé ( https://github.com/Microsoft/TypeScript/issues/15409 et https://github.com/Microsoft/TypeScript/issues/15419 ) car l'objet props est initialisé à {}
SOLUTION
Il suffit de faire - class Foo extends React.Component {}
comme prop et state sont initialisés à {}
interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { }
Les accessoires et l'état sont initialisés à {}
. Ainsi, pour un composant sans état ni accessoire, nous pouvons simplement faire:
class Foo extends React.Component {}
Selon cette directive et mon exp, je dirais:
class Foo extends React.Component<null, null> {}
lorsque vous savez que vous ne recevrez ni accessoires ni étatclass Foo extends React.Component<any, any> {}
lorsque vous savez que vous recevrez des accessoires et un état, mais vous ne vous souciez vraiment pas de leur apparenceclass Foo extends React.Component<{}, {}> {}
jamais vu, semble étrangeclass Foo extends React.Component<undefined, undefined> {}
idem null
, à vous de choisir. Je vois plus souvent null
que undefined
class Foo extends React.Component<void, void> {}
mauvaise idée, car semble être réservé au retour de fonctions (quand vous n'en attendez pas)Les autres avis sont les bienvenus
Je crée toujours une interface d'accessoires pour chaque composant, même si elle est vide. Il garde les choses cohérentes et me permet d'ajouter facilement des accessoires plus tard si nécessaire.
Interface FooProps { }
class foo extends React.Component<FooProps, any> {
}
Comme répondu pour cette question , vous pouvez utiliser la classe React.SFC<{}>
const MyStatelessComponent : React.StatelessComponent<{}> = props =>
<div>{props.children}</div>
Ou si votre marquage devient plus gros:
const MyStatelessComponent : React.StatelessComponent<{}> = props => {
{/* Some code here */}
return <div>{props.children}</div>
}
Stateful (composants basés sur la classe) et composants sans état, il y a beaucoup de conceptions sur Internet concernant l'utilisation de l'un ou l'autre, j'ai compris ces concepts en utilisant cette liste (avant d'avoir une expérience pratique):
Apatride
Exemples: Menu, UserInfo, List, SideBar.
Stateful
Exemples: UserPage, FollowersSidebar, ArticlesContainer.