JSX est une syntaxe de type XML incorporable.
Il est destiné à être transformé en JavaScript valide, bien que la sémantique de cette transformation soit spécifique à l'implémentation.
JSX a gagné en popularité avec le framework React, mais a depuis vu d'autres implémentations.
TypeScript prend en charge l'incorporation, la vérification de type et la compilation de JSX directement dans JavaScript.JSX, vous devez faire deux choses..tsxjsxTypeScript est livré avec trois modes JSX : preserve, react, et react-native.
Ces modes n'affectent que la phase d'émission, la vérification du type n'est pas affectée.
Le mode preserve conservera le JSX comme partie de la sortie à consommer davantage par une autre étape de transformation (par exemple, Babel).
De plus, la sortie aura une extension de fichier .jsx.
Le mode react émettra React.createElement, il n'est pas nécessaire de passer par une transformation JSX avant utilisation et la sortie aura une extension de fichier .js.
Le mode react-native équivaut preserve à conserver tous les fichiers JSX, mais la sortie aura plutôt une extension de fichier .js.| Mode | Contribution | Sortie | Extension du fichier de sortie |
|---|---|---|---|
preserve |
‹div/› |
‹div/› |
.jsx |
react |
‹div/› |
React.createElement("div") |
.js |
react-native |
‹div/› |
‹div/› |
.js |
--jsx de ligne de commande ou de l'option correspondante dans votre fichier tsconfig.json.React est codé en dur.
Vous devez donc rendre React disponible avec un "R" (majuscule).
bar a le type foo.
étant donné que TypeScript utilise également les crochets angulaires pour les assertions de types, sa combinaison avec la syntaxe de JSX soulèverait certaines difficultés d'analyse.
En conséquence, TypeScript interdit les assertions de type à crochets angulaires dans les fichiers .tsx..tsx, un opérateur d'assertion de type alternatif doit être utilisé : as.
L'exemple peut facilement être réécrit avec l'opérateur as.as est disponible dans les deux fichiers .ts et .tsx,
et son comportement est identique au style d'assertion de type à crochet.JSX, vous devez d'abord comprendre la différence entre les éléments intrinsèques et les éléments basés sur des valeurs.
Si vous utilisez une expression JSX ‹expr /›, vous pouvez faire référence à un élément intrinsèque de l'environnement (par exemple, un environnement DOM div ou span)
ou à un composant personnalisé que vous avez créé. Ceci est important pour deux raisons :React, les éléments intrinsèques sont émis sous forme de chaînes ( React.createElement("div") ),
alors qu'un composant que vous avez créé ne l'est pas ( React.createElement(MyComponent) ).
JSX doivent être recherchés différemment.
Les attributs d'éléments intrinsèques doivent être connus intrinsèquement,
alors que les composants voudront probablement spécifier leur propre ensemble d'attributs.
TypeScript utilise la même convention que React pour les distinguer.
Un élément intrinsèque commence toujours par une lettre minuscule et un élément basé sur une valeur commence toujours par une lettre majuscule.JSX.IntrinsicElements.
Par défaut, si cette interface n'est pas spécifiée, tout se passe bien et les éléments intrinsèques ne seront pas vérifiés.
Cependant, si cette interface est présente, le nom de l'élément intrinsèque est alors considéré comme une propriété de l'interface JSX.IntrinsicElements.JSX.IntrinsicElements.JSX.IntrinsicElements comme suit :
JSX,
TypeScript essaie d'abord de résoudre l'expression en tant que composant fonctionnel sans état à l'aide de la résolution de surcharge.
Si le processus aboutit, TypeScript finit de résoudre l'expression en sa déclaration.
Si la valeur ne parvient pas à résoudre en tant que SFC, TypeScript essaiera de la résoudre en tant que composant de classe.
Si cela échoue, TypeScript signalera une erreur.JavaScript dont le premier argument est un objet props.
TypeScript impose que son type de retour doit être assignable JSX.Element.JavaScript, les surcharges de fonctions peuvent également être utilisées ici:MyComponent était une classe ES6, le type de classe serait le constructeur et la statique de cette classe.
Si MyComponent était une fonction d'usine, le type de classe serait cette fonction.ES6, le type d'instance serait le type d'une instance de cette classe et, dans le cas d'une fonction factory, ce serait le type de la valeur renvoyée par la fonction.JSX.ElementClass sinon cela entraînera une erreur.
Par défaut JSX.ElementClass est {}, mais il peut être augmentée pour limiter l'utilisation de JSX aux seuls types qui sont conformes à l'interface appropriée.JSX.IntrinsicElementsJSX.ElementAttributesProperty.
Il devrait être déclaré avec une seule propriété. Le nom de cette propriété est ensuite utilisé.
A partir de TypeScript 2.8, si JSX.ElementAttributesProperty n'est pas fourni, le type du premier paramètre du constructeur de l'élément de
classe ou l'appel de SFC sera utilisé à la place.JSX.
Les propriétés facultatives et obligatoires sont prises en charge.data-* attribut),
il n'est pas considéré comme une erreur s'il n'est pas trouvé dans le type d'attribut d'élément.
JSX.IntrinsicAttributes peut être utilisée pour spécifier des propriétés supplémentaires utilisées par le framework JSX
qui ne sont généralement pas utilisées par les propriétés ou les arguments des composants, par exemple la clé dans React.
En outre, le type générique JSX.IntrinsicClassAttributes‹T› peut également être utilisé pour spécifier le même type d'attributs
supplémentaires uniquement pour les composants de classe (et non les SFC).
Dans ce type, le paramètre générique correspond au type d'instance de classe.
Dans React, ceci est utilisé pour autoriser l'attribut ref de type Ref‹T›.JSX doivent fournir un attribut pour chaque balise.TypeScript 2.3, TypeScript a introduit la vérification de type des enfants.
children est une propriété spéciale dans un type d'attribut d'élément dans lequel les enfants JSXExpression sont supposés être insérés dans les attributs.
Semblable à la façon dont TypeScript utilise JSX.ElementAttributesProperty pour déterminer
le nom des accessoires , TypeScript utilise JSX.ElementChildrenAttribute pour déterminer le nom des enfants contenus dans ces accessoires.
JSX.ElementChildrenAttribute doit être déclaré avec une seule propriété.React si vous les utilisez.JSX est tapé comme any. Vous pouvez personnaliser le type en spécifiant l'interface JSX.Element.
Cependant, il n'est pas possible de récupérer des informations de type sur l'élément, les attributs ou les enfants du JSX à partir de cette interface.
C'est une boîte noire.JSX vous permet d'incorporer des expressions entre les balises en les entourant d'accolades ({ }).preserve, ressemble à ceci :JSX avec React, vous devez utiliser les typages React.
Ces typages définissent l'espace de noms JSX à utiliser avec React.jsx: react du compilateur est configurable.
Il peut être défini à l'aide de l'option jsxFactory de ligne de commande ou d'un @jsx de commentaire intégré pour le définir fichier par fichier.
Par exemple, si vous définissez jsxFactory sur createElement, ‹div /› émettra en tant que createElement("div") au lieu de React.createElement("div").TypeScript 2.8) :JSX (pour les informations de contrôle de type) avant de revenir à l'espace global.
Si la fabrique est définie comme React.createElement(valeur par défaut), le compilateur vérifiera React.JSX avant de rechercher une variable globale JSX.
Si la fabrique est définie comme h, elle recherchera h.JSX avant une globale JSX.