Vous pouvez utiliser tsx
au lieu de ts
avec très peu de différence. tsx
permet évidemment l'utilisation de jsx
balises à l'intérieur du typographie, mais cela introduit des ambiguïtés d'analyse qui rendent tsx légèrement différent. D'après mon expérience, ces différences ne sont pas très grandes:
Les assertions de type avec <>
ne fonctionnent pas car c'est le marqueur d'une balise jsx.
Typescript a deux syntaxes pour les assertions de type. Ils font tous les deux exactement la même chose mais l'un est utilisable dans tsx, l'autre ne l'est pas:
let a: any;
let s = a as string // ok in tsx and ts
let s2 = <string>a // only valid in ts
J'utiliserais également as
au lieu de <>
dans des ts
fichiers pour la cohérence. as
a été introduit dans Typescript car il <>
n'était pas utilisable danstsx
Les fonctions fléchées génériques sans contrainte ne sont pas analysées correctement
La fonction de flèche ci-dessous est correcte ts
mais une erreur dans tsx
as <T>
est interprétée comme le début d'une balise danstsx
const fn = <T>(a: T) => a
Vous pouvez contourner ce problème en ajoutant une contrainte ou en n'utilisant pas de fonction de flèche:
const fn = <T extends any>(a: T) => a
const fn = <T,>(a: T) => a // this also works but looks weird IMO
const fn = function<T>(a: T) { return a;}
Remarque
Bien que vous puissiez utiliser tsx au lieu de ts, je vous le déconseille. Convention est une chose puissante, les gens associent tsx
avec jsx
et seront probablement surpris que vous n'avez pas des jsx
étiquettes, la meilleure surprise développeur de garder au minimum.
Bien que les ambiguïtés ci-dessus (bien que probablement pas une liste complète) ne soient pas grandes, elles ont probablement joué un grand rôle dans la décision d'utiliser une extension de fichier dédiée pour la nouvelle syntaxe afin de garder les ts
fichiers rétrocompatibles.
(
où une balise JSX ne peut pas apparaître donc il n'y a pas d'ambiguïté.C'est une sorte de convention à utiliser
x
à la fin lorsque votre JavaScript est enJSX Harmony
mode. Autrement dit, lorsque cela est valide:Cependant, votre extension de fichier n'a pas vraiment d'importance, tant que vos pré-processeurs sont conscients de votre décision (browserify ou webpack). Pour ma part, j'utilise
.js
pour tous mes JavaScript, même lorsqu'ils sont React. De même pour tapuscrit,ts/tsx
.ÉDITER
Maintenant, je recommanderais fortement d'utiliser JSX pour Javascript avec la syntaxe React et TSX pour TypeScript avec React car la plupart des éditeurs / IDE utiliseront l'extension pour activer ou non la syntaxe React. Il est également considéré comme plus expressif.
la source
ts
ettsx
. Dans TypeScript, le compilateur n'active que la syntaxe JSX dans les.tsx
fichiers, car la syntaxe crée une certaine ambiguïté avec la syntaxe TS (comme la<>
syntaxe d'assertion), pour résoudre ce problème, le compilateur fait des hypothèses différentes dans untsx
fichier par opposition à unts
fichier. Voir la réponse de Titian Cernicova-Dragomir.La raison pour laquelle l'extension .jsx a été introduite est que JSX est une extension de la syntaxe JS et que les fichiers .jsx ne contiennent donc pas de JavaScript valide.
TypeScript suit la même convention en introduisant les extensions .ts et .tsx. Une différence pratique est que .tsx n'autorise pas
<Type>
les assertions de type car la syntaxe est en conflit avec les balises JSX.as Type
assertions a été introduite en remplacement<Type>
et considérée comme un choix privilégié pour des raisons de cohérence à la fois dans .ts et .tsx. Dans le cas où le code de .ts est utilisé dans le fichier .tsx,<Type>
il devra être corrigé.L'utilisation de l'extension .tsx implique qu'un module est lié à React et utilise la syntaxe JSX. Si ce n'est pas le cas, l'extension peut donner une fausse impression sur le contenu du module et le rôle dans le projet, c'est l'argument contre l'utilisation de l'extension .tsx par défaut.
D'un autre côté, si un fichier est lié à React et a de bonnes chances de contenir JSX à un moment donné, il peut être nommé .tsx depuis le début pour éviter de le renommer plus tard.
Par exemple, les fonctions utilitaires qui sont utilisées avec les composants React peuvent impliquer JSX à tout moment et peuvent donc utiliser en toute sécurité des noms .tsx, alors que la structure de code Redux n'est pas censée utiliser directement les composants React, peut être utilisée et testée indépendamment de React et peut utiliser des noms .ts.
la source
Je crois qu'avec les fichiers .tsx, vous pouvez utiliser tout le code JSX (JavaScript XML). Alors que dans le fichier .ts, vous ne pouvez utiliser que du texte dactylographié.
la source
.ts
les fichiers ont une<AngleBracket>
syntaxe d'assertion de type qui entre en conflit avec la grammaire JSX. Afin d'éviter de briser une tonne de personnes, nous utilisons.tsx
pour JSX et avons ajouté lafoo as Bar
syntaxe autorisée dans les fichiers.ts
et.tsx
.Et l'autre est la syntaxe as:
On peut utiliser .ts avec
as-syntax
mais<string>someValue
c'est cool!la source