Fermer

janvier 16, 2020

Réagissez avec TypeScript: Meilleures pratiques –


React et TypeScript sont deux technologies impressionnantes utilisées par de nombreux développeurs de nos jours. Savoir comment faire peut devenir délicat, et parfois il est difficile de trouver la bonne réponse. Ne pas s'inquiéter. Nous avons rassemblé les meilleures pratiques ainsi que des exemples pour clarifier les doutes que vous pourriez avoir.

Plongeons-nous!

Comment React et TypeScript fonctionnent ensemble

Avant de commencer, revoyons comment React et TypeScript fonctionnent ensemble . React est une «bibliothèque JavaScript pour la création d'interfaces utilisateur», tandis que TypeScript est un «sur-ensemble typé de JavaScript qui se compile en JavaScript simple». En les utilisant ensemble, nous construisons essentiellement nos interfaces utilisateur à l'aide d'une version typée de JavaScript.

La raison vous pourriez les utiliser ensemble serait d'obtenir les avantages d'un langage de type statique (TypeScript) pour votre interface utilisateur. Cela signifie plus de sécurité et moins de bogues à expédier au front-end.

Est-ce que TypeScript compile mon code React?

Une question courante qu'il est toujours bon d'examiner est de savoir si TypeScript compile votre code React. Le fonctionnement de TypeScript est similaire à cette interaction:

TS : "Hé, est-ce tout votre code d'interface utilisateur?"
React : "Ouaip!"
TS : "Cool! Je vais le compiler et m'assurer que vous n'avez rien manqué. "
Réagissez :" Ça me semble bien! "

Donc la réponse est oui, c'est le cas! Mais plus tard, lorsque nous couvrirons les paramètres tsconfig.json la plupart du temps, vous voudrez utiliser "noEmit": true . Cela signifie que TypeScript n'émettra pas JavaScript après la compilation. En effet, nous utilisons généralement TS pour faire notre TypeScript.

La sortie est gérée, dans un paramètre CRA, par react-scripts . Nous exécutons yarn build et react-scripts regroupe la sortie pour la production.

Pour récapituler, TypeScript compile votre code React pour vérifier votre code. Il n'émet aucune sortie JavaScript (dans la plupart des scénarios). La sortie est toujours similaire à un projet non-TypeScript React.

TypeScript peut-il fonctionner avec React et webpack?

Oui, TypeScript peut fonctionner avec React et webpack. Heureusement pour vous, le manuel officiel de TypeScript contient un guide .

Avec un peu de chance, cela vous donne un petit rappel sur la façon dont les deux fonctionnent ensemble. Maintenant, passons aux meilleures pratiques!

Meilleures pratiques

Nous avons recherché les questions les plus courantes et rassemblé cette liste pratique des cas d'utilisation les plus courants pour React avec TypeScript. De cette façon, vous pouvez suivre les meilleures pratiques dans vos projets en utilisant cet article comme référence.

Configuration

L'une des parties les moins amusantes, mais les plus importantes du développement est la configuration. Comment pouvons-nous mettre en place les choses dans les plus brefs délais qui fourniront une efficacité et une productivité maximales? Nous discuterons de la configuration du projet, notamment:

  • tsconfig.json
  • ESLint
  • Prettier
  • Extensions et paramètres du code VS.

Configuration du projet

La façon la plus rapide de démarrer une application React / TypeScript est en utilisant create-react-app avec le modèle TypeScript. Vous pouvez le faire en exécutant:

 npx create-react-app my-app --template typescript

Cela vous donnera le strict minimum pour commencer à écrire React avec TypeScript. Quelques différences notables sont:

  • l'extension de fichier .tsx
  • la tsconfig.json
  • la react-app-env.d.ts

La tsx est pour “TypeScript JSX”. Le tsconfig.json est le fichier de configuration TypeScript, qui a des valeurs par défaut définies. react-app-env.d.ts fait référence aux types de react-scripts et aide à des choses comme autoriser les importations SVG.

tsconfig.json [19659002] Heureusement pour nous, le dernier modèle React / TypeScript génère tsconfig.json pour nous. Cependant, ils ajoutent le strict minimum pour commencer. Nous vous suggérons de modifier le vôtre pour qu'il corresponde à celui ci-dessous. Nous avons également ajouté des commentaires pour expliquer le but de chaque option:

 {
  "options de compilation": {
    "target": "es5", // Spécifiez la version cible ECMAScript
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ]// Liste des fichiers de bibliothèque à inclure dans la compilation
    "allowJs": true, // Autorise la compilation de fichiers JavaScript
    "skipLibCheck": true, // Ignore la vérification de type de tous les fichiers de déclaration
    "esModuleInterop": true, // Désactive les importations d'espace de noms (importation * en tant que fs de "fs") et active les importations de style CJS / AMD / UMD (importation de fs en provenance de "fs")
    "allowSyntheticDefaultImports": true, // Autorise les importations par défaut à partir de modules sans exportation par défaut
    "strict": true, // Active toutes les options de vérification de type stricte
    "forceConsistentCasingInFileNames": true, // Interdire les références en cas de cohérence au même fichier.
    "module": "esnext", // Spécifiez la génération du code du module
    "moduleResolution": "node", // Résoudre les modules en utilisant le style Node.js
    "resolJsonModule": true, // Inclut les modules importés avec l'extension .json
    "isolatedModules": true, // Transpile chaque fichier en module séparé
    "noEmit": true, // Ne pas émettre de sortie (ce qui signifie ne pas compiler de code, effectuer uniquement une vérification de type)
    "jsx": "react" // Supporte JSX dans les fichiers .tsx
    "sourceMap": true, // *** Génère un fichier .map correspondant ***
    "declaration": true, // *** Génère le fichier .d.ts correspondant ***
    "noUnusedLocals": true, // *** Signaler des erreurs sur les sections locales inutilisées ***
    "noUnusedParameters": true, // *** Signaler des erreurs sur les paramètres inutilisés ***
    "experimentalDecorators": true // *** Active le support expérimental pour les décorateurs ES ***
    "incremental": true // *** Activer la compilation incrémentielle en lisant / écrivant les informations des compilations précédentes dans un fichier sur le disque ***
        "noFallthroughCasesInSwitch": true // *** Signaler les erreurs pour les cas de panne dans l'instruction switch ***
  },
  "comprennent": [
    "src/**/*" // *** The files TypeScript should type check ***
  ],
  "exclude": ["node_modules", "build"] // *** Les fichiers à ne pas taper check ***
}

Les recommandations supplémentaires proviennent de la communauté [react-typescript-cheatsheet] (https://github.com/typescript-cheatsheets/react-typescript-cheatsheet) et les explications proviennent de la Documentation des options du compilateur dans le manuel TypeScript officiel. C'est une ressource merveilleuse si vous voulez en savoir plus sur les autres options et ce qu'elles font.

ESLint / Prettier

Afin de vous assurer que votre code suit les règles du projet ou de votre équipe, et le style est cohérent, il est recommandé de configurer ESLint et Prettier. Pour les faire jouer correctement, procédez comme suit pour le configurer.

  1. Installez les dépendances de développement requises:

     yarn add eslint @ typescript-eslint / parser @ typescript-eslint / eslint-plugin eslint-plugin-react - -dev
     
  2. Créez un fichier .eslintrc.js à la racine et ajoutez ce qui suit:

     module.exports = {
      parser: '@ typescript-eslint / parser', // Spécifie l'analyseur ESLint
      étend: [
        'plugin:react/recommended',  // Uses the recommended rules from @eslint-plugin-react
        'plugin:@typescript-eslint/recommended',  // Uses the recommended rules from @typescript-eslint/eslint-plugin
      ],
      parserOptions: {
      ecmaVersion: 2018, // Permet l'analyse des fonctionnalités ECMAScript modernes
      sourceType: 'module', // Permet l'utilisation des importations
      ecmaFeatures: {
        jsx: true, // permet l'analyse de JSX
      },
      },
      règles:  {
        // Place pour spécifier les règles ESLint. Peut être utilisé pour remplacer les règles spécifiées à partir des configurations étendues
        // par exemple. "@ typescript-eslint / explicit-function-return-type": "off",
      },
      réglages:  {
        réagir: {
          version: 'detect', // Indique à eslint-plugin-react de détecter automatiquement la version de React à utiliser
        },
      },
    };
     
  3. Ajouter des dépendances plus jolies:

     fil ajouter plus joliment eslint-config-prettier eslint-plugin-prettier --dev
     
  4. Créez un fichier .prettierrc.js à la racine et ajoutez ce qui suit:

     module.exports = {
      semi: vrai,
      trailingComma: 'all',
      singleQuote: true,
      printWidth: 120,
      tabWidth: 4,
    };
     
  5. Mettez à jour le fichier .eslintrc.js :

     module.exports = {
      parser: '@ typescript-eslint / parser', // Spécifie l'analyseur ESLint
      étend: [
        'plugin:react/recommended',  // Uses the recommended rules from @eslint-plugin-react
        'plugin:@typescript-eslint/recommended',  // Uses the recommended rules from the @typescript-eslint/eslint-plugin
    +   'prettier/@typescript-eslint',  // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
    +   'plugin:prettier/recommended',  // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
      ],
      parserOptions: {
      ecmaVersion: 2018, // Permet l'analyse des fonctionnalités ECMAScript modernes
      sourceType: 'module', // Permet l'utilisation des importations
      ecmaFeatures: {
        jsx: true, // permet l'analyse de JSX
      },
      },
      règles:  {
        // Place pour spécifier les règles ESLint. Peut être utilisé pour remplacer les règles spécifiées à partir des configurations étendues
        // par exemple. "@ typescript-eslint / explicit-function-return-type": "off",
      },
      réglages:  {
        réagir: {
          version: 'detect', // Indique à eslint-plugin-react de détecter automatiquement la version de React à utiliser
        },
      },
    };
    

Ces recommandations proviennent d'une ressource communautaire écrite appelée «Utilisation d'ESLint et de Prettier dans un projet TypeScript» par Robert Cooper . Si vous visitez son blog, vous pouvez en savoir plus sur le «pourquoi» derrière ces règles et configurations.

Extensions et paramètres VSCode

Nous avons ajouté ESLint et Prettier et la prochaine étape pour améliorer notre DX est pour corriger / améliorer automatiquement notre code lors de la sauvegarde.

Tout d'abord, installez l'extension ESLint pour VSCode . Cela permettra à ESLint de s'intégrer parfaitement à votre éditeur.

Ensuite, mettez à jour vos paramètres Workspace en ajoutant ce qui suit à votre .vscode / settings.json :

 {
  "eslint.autoFixOnSave": vrai,
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    { "language": "typescript", "autoFix": true },
    { "language": "typescriptreact", "autoFix": true }
  ],
  "editor.formatOnSave": vrai,
  "[javascript]": {
    "editor.formatOnSave": faux
  },
  "[javascriptreact]": {
    "editor.formatOnSave": faux
  },
  "[typescript]": {
    "editor.formatOnSave": faux
  },
  "[typescriptreact]": {
    "editor.formatOnSave": faux
  }
} 

Cela permettra à VS Code de travailler sa magie et de corriger votre code lorsque vous enregistrez. C'est beau!

Ces suggestions proviennent également de l'article précédemment lié "Utilisation d'ESLint et de Prettier dans un projet TypeScript" par Robert Cooper .

Composants

L'un des concepts fondamentaux de React est Composants. Ici, nous ferons référence aux composants standard à partir de React v16.8, c'est-à-dire ceux qui utilisent des hooks par opposition aux classes.

En général, il y a beaucoup à se soucier des composants de base. Prenons un exemple:

 importez React depuis 'react'

// Écrit en tant que déclaration de fonction
fonction Heading (): React.ReactNode {
  retour 

Mon titre de site Web

} // Écrit en tant qu'expression de fonction const OtherHeading: React.FC = () =>

Mon titre de site Web

Remarquez la principale différence ici. Dans le premier exemple, nous écrivons notre fonction en tant que déclaration de fonction . Nous annotons le type de retour avec React.Node parce que c'est ce qu'il renvoie. En revanche, le deuxième exemple utilise une expression de fonction . Étant donné que la deuxième instance renvoie une fonction, au lieu d'une valeur ou d'une expression, nous annotons le type de fonction avec React.FC pour React "Function Component".

Cela peut être déroutant pour se souvenir des deux. C'est surtout une question de choix de conception. Quelle que soit l'option que vous choisissez d'utiliser dans votre projet, utilisez-la de manière cohérente.

Accessoires

Le prochain concept de base que nous aborderons est celui des accessoires. Vous pouvez définir vos accessoires à l'aide d'une interface ou d'un type. Prenons un autre exemple:

 importez React depuis 'react'

accessoires d'interface {
  nom: chaîne;
  couleur: chaîne;
}

type OtherProps = {
  nom: chaîne;
  couleur: chaîne;
}

// Notez ici que nous utilisons la déclaration de fonction avec l'interface Props
en-tête de fonction ({nom, couleur}: accessoires): React.ReactNode {
  retour 

Mon titre de site Web

} // Notez ici que nous utilisons l'expression de fonction avec le type OtherProps const OtherHeading: React.FC = ({nom, couleur}) =>   

Mon titre de site Web

En ce qui concerne les types ou les interfaces, nous vous suggérons de suivre les directives présentées par la communauté react-typescript-cheatsheet :

  • "utilisez toujours l'interface pour la définition de l'API publique lors de la création d'une bibliothèque ou d'un tiers- définitions de type ambiant de partie. "
  • " envisagez d'utiliser le type pour vos accessoires et états de composant React, car il est plus contraint. "

Vous pouvez en savoir plus sur la discussion et voir un tableau pratique comparant les types et les interfaces ici .

Regardons un autre exemple pour que nous puissions voir quelque chose d'un peu plus pratique:

 importez React à partir de 'react'

type Props = {
  / ** couleur à utiliser pour le fond * /
  couleur?: chaîne;
  / ** accessoire enfant standard: accepte tout nœud React valide * /
  enfants: React.ReactNode;
  / ** fonction de rappel passée au gestionnaire onClick * /
  onClick: () => void;
}

Bouton const: React.FC  = ({children, color = 'tomato', onClick}) => {
   retour 
}

Dans ce composant






Source link