Amis, à la veille du week-end, nous voulons partager avec vous une autre publication intéressante que nous voulons coïncider avec le lancement d'un nouveau groupe sur le cours
"JavaScript Developer" .

Après avoir passé les derniers mois à développer des applications et des bibliothèques React à l'aide de Typescript, j'ai décidé de partager certaines des choses que j'ai apprises pendant cette période. Dans ce guide, je vais vous parler des modèles que j'utilise pour Typescript et React dans 80% des cas.
Dois-je apprendre le tapuscrit pour le développement d'applications React? Ça vaut le coup, ça vaut toujours le coup! Pour ma part, j'ai réalisé dans la pratique qu'un typage strict conduit à écrire du code beaucoup plus fiable, un développement rapide, surtout dans les grands projets. Au début, vous serez probablement déçu, mais en travaillant, vous constaterez qu'au moins un modèle minimal sera vraiment très utile.
Et si vous êtes coincé sur quelque chose, n'oubliez pas que vous pouvez toujours taper quelque chose comme n'importe lequel. Quel que soit votre nouvel ami. Et maintenant, nous allons passer directement aux exemples.
Votre composant de réaction de base avec dactylographié
À quoi ressemble le composant React standard sur le dactylographié? Comparons-le avec le composant react en javascript.
import React from 'react' import PropTypes from 'prop-types' export function StandardComponent({ children, title = 'Dr.' }) { return ( <div> {title}: {children} </div> ) } StandardComponent.propTypes = { title: PropTypes.string, children: PropTypes.node.isRequired, }
Et maintenant la version dactylographiée:
import * as React from 'react' export interface StandardComponentProps { title?: string children: React.ReactNode } export function StandardComponent({ children, title = 'Dr.', }: StandardComponentProps) { return ( <div> {title}: {children} </div> ) }
Très similaire, non? Nous avons remplacé
propTypes
par l'interface
typescript
.
L'en-tête d'
prop
reste facultatif, tandis que l'hélice de l'héritier est toujours requise. Nous avons exporté notre interface au cas où un autre composant aurait besoin d'un lien vers celui-ci.
Extension des attributs HTML standard
Si nous voulons que le composant parent puisse fournir des attributs
div
typés supplémentaires, tels que
aria-hidden
,
style
ou
className
, nous pouvons les définir dans l'
interface
ou étendre l'interface intégrée. Dans l'exemple ci-dessous, nous disons que notre composant accepte toutes les propriétés
div
standard en plus de l'en-tête et des descendants.
import * as React from 'react' export interface SpreadingExampleProps extends React.HTMLAttributes<HTMLDivElement> { title?: string children: React.ReactNode } export function SpreadingExample({ children, title = 'Dr.', ...other }: SpreadingExampleProps) { return ( <div {...other}> {title}: {children} </div> ) }
Gestion des événements
Nous pouvons typifier les gestionnaires d'événements pour nous assurer que l'argument d'événement est du type correct. L'exemple ci-dessous montre différentes manières d'atteindre cet objectif:
export interface EventHandlerProps { onClick: (e: React.MouseEvent) => void } export function EventHandler({ onClick }: EventHandlerProps) {
Vous ne savez pas quelle signature d'argument utiliser? Dans l'éditeur, passez la souris sur la propriété correspondante du gestionnaire d'événements.
Utilisation de génériques avec des composants React
Il s'agit d'une fonctionnalité plus avancée, mais elle est vraiment puissante. En règle générale, vous définissez des types de données dans les composants React avec des attributs spécifiques. Supposons que votre composant ait besoin d'un objet
profile
.
interface ProfileType { name: string image: string age: number | null } interface ProfilesProps { profiles: Array<ProfileType> } function Profiles(props: ProfilesProps) {
Imaginons maintenant que vous ayez un composant pouvant accepter un tableau de tout type. Les génériques sont comme l'envoi de colis. Le courrier (notre composant) n'a pas besoin de connaître le contenu du colis que vous envoyez, mais l'expéditeur (composant parent) attend du destinataire qu'il reçoive le contenu qu'il a envoyé.
Nous l'implémentons comme ceci:
interface GenericsExampleProps<T> { children: (item: T) => React.ReactNode items: Array<T> } export function GenericsExample<T>({ items, children, }: GenericsExampleProps<T>) { return ( <div> {items.map(item => { return children(item) })} </div> ) }
Un exemple un peu étrange ... néanmoins, il démontre l'essence. Le composant accepte un tableau d'éléments de tout type, le traverse et appelle la fonction
children
tant que fonction de rendu avec un élément de tableau. Lorsque notre composant parent fournit un moteur de rendu en tant qu'héritier, l'élément sera correctement saisi!
Je ne comprends pas? C'est normal. Je n'ai pas moi-même trouvé de génériques jusqu'à la fin, mais il est peu probable que vous ayez besoin de les comprendre à fond. Cependant, plus vous travaillez avec
typescript
, plus cela aura du sens.
Crochets de frappe
Les crochets fonctionnent généralement hors de la boîte. Les deux exceptions peuvent uniquement être
useRef
et
useReducer
. L'exemple ci-dessous montre comment nous pouvons taper refs.
import * as React from 'react' interface HooksExampleProps {} export function HooksExample(props: HooksExampleProps) { const [count, setCount] = React.useState(0) const ref = React.useRef<HTMLDivElement | null>(null) // start our timer React.useEffect( () => { const timer = setInterval(() => { setCount(count + 1) }, 1000) return () => clearTimeout(timer) }, [count] )
Notre état est automatiquement tapé, mais nous avons tapé manuellement ref pour indiquer qu'il sera
null
ou contiendra un élément
div
. Lorsque nous
useEffect
à ref dans la fonction
useEffect
, nous devons nous assurer qu'il n'est pas
null
.
Typage de boîte de vitesses
Avec la boîte de vitesses, c'est un peu plus compliqué, mais si elle est correctement tapée, c'est super.
Utilisation de typeof
et keyof
pour keyof
options des composants
Supposons que nous ayons besoin d'un bouton qui peut avoir une apparence différente, chacun étant défini dans un objet avec un ensemble de clés et de styles, par exemple:
const styles = { primary: { color: 'blue', }, danger: { color: 'red', }, }
Notre composant bouton doit accepter une propriété de
type
, qui peut être
n'importe quelle clé de l'objet
styles
(par exemple,
"primaire" ou
"danger" ). On peut le taper tout simplement:
const styles = { primary: { color: 'blue', }, danger: { color: 'red', }, }
Ces exemples vous aideront à parcourir 80% du chemin. Si vous êtes coincé, cela vaut souvent la peine
jetez un œil aux exemples open source existants.
Sancho UI est un ensemble de composants réactifs,
construit en utilisant la dactylographie et l'émotion.
Blueprint est un autre ensemble de composants
react
construit sur
typescript
.
Eh bien, selon la tradition établie, nous attendons vos commentaires.