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..tsx
jsx
TypeScript
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.IntrinsicElements
JSX.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
.