Você pode usar em tsx
vez de ts
com muito pouca diferença. tsx
obviamente permite o uso de jsx
tags dentro do typescript, mas isso introduz algumas ambigüidades de análise que tornam o tsx ligeiramente diferente. Na minha experiência, essas diferenças não são muito grandes:
As afirmações de tipo com <>
não funcionam, pois esse é o marcador para uma tag jsx.
O typescript tem duas sintaxes para asserções de tipo. Ambos fazem exatamente a mesma coisa, mas um é utilizável em tsx e o outro não é:
let a: any;
let s = a as string // ok in tsx and ts
let s2 = <string>a // only valid in ts
Eu usaria em as
vez de <>
em ts
arquivos também para consistência. as
foi realmente introduzido no Typescript porque <>
não era utilizável emtsx
As funções genéricas das setas sem restrições não são analisadas corretamente
A função de seta abaixo é ok em ts
mas um erro em tsx
como <T>
é interpretado como o início de uma tag emtsx
const fn = <T>(a: T) => a
Você pode contornar isso adicionando uma restrição ou não usando uma função de seta:
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;}
Nota
Embora você possa usar tsx em vez de ts, eu não recomendo. Convenção é uma coisa poderosa, as pessoas associam tsx
com jsx
e provavelmente será surpreendido você não tem nenhum jsx
tags, melhor surpresa desenvolvedor reduzir ao mínimo indispensável.
Embora as ambigüidades acima (embora provavelmente não sejam uma lista completa) não sejam grandes, elas provavelmente desempenharam um grande papel na decisão de usar uma extensão de arquivo dedicada para a nova sintaxe a fim de manter os ts
arquivos compatíveis com versões anteriores.
(
que uma tag JSX não pode aparecer, portanto não há ambigüidade.É uma espécie de convenção para usar
x
no final, quando o JavaScript está noJSX Harmony
modo. Ou seja, quando for válido:No entanto, a extensão do seu arquivo não importa, desde que seus pré-processadores estejam cientes de sua decisão (browserify ou webpack). Eu, por exemplo, uso
.js
para todo o meu JavaScript, mesmo quando eles são React. O mesmo se aplica ao TypeScriptts/tsx
,.EDITAR
Agora, eu recomendo fortemente o uso de JSX para Javascript com sintaxe React e TSX para TypeScript com React porque a maioria dos editores / IDEs usará a extensão para habilitar ou não a sintaxe React. É também considerá-lo mais expressivo.
fonte
ts
etsx
. No TypeScript, o compilador só habilita a sintaxe JSX em.tsx
arquivos, porque a sintaxe cria alguma ambigüidade com a sintaxe TS (como a<>
sintaxe de asserção). Para resolver isso, o compilador faz suposições diferentes em umtsx
arquivo em oposição a umts
arquivo. Veja a resposta de Titian Cernicova-Dragomir.O motivo pelo qual a extensão .jsx foi introduzida é que JSX é uma extensão da sintaxe JS e, portanto, os arquivos .jsx não contêm JavaScript válido.
O TypeScript segue a mesma convenção ao introduzir as extensões .ts e .tsx. Uma diferença prática é que .tsx não permite
<Type>
asserções de tipo porque a sintaxe está em conflito com as tags JSX.as Type
assertions foi introduzido como um substituto<Type>
e considerado uma escolha preferencial por motivos de consistência em .ts e .tsx. Caso o código de .ts seja usado em arquivo .tsx,<Type>
será necessário consertar.O uso da extensão .tsx implica que um módulo está relacionado ao React e usa a sintaxe JSX. Caso contrário, a extensão pode dar uma falsa impressão sobre o conteúdo do módulo e a função no projeto, este é o argumento contra o uso da extensão .tsx por padrão.
Por outro lado, se um arquivo estiver relacionado ao React e tiver boas chances de conter JSX em algum ponto, ele pode ser nomeado como .tsx desde o início para evitar renomeá-lo posteriormente.
Por exemplo, funções utilitárias que são usadas junto com componentes React podem envolver JSX em qualquer ponto e, portanto, podem ser usadas com segurança nomes .tsx, enquanto a estrutura de código Redux não deve usar componentes React diretamente, pode ser usada e testada separadamente de React e pode usar nomes .ts.
fonte
Eu acredito que com os arquivos .tsx você pode usar todo o código JSX (JavaScript XML). Enquanto no arquivo .ts você pode usar apenas o texto digitado.
fonte
.ts
os arquivos têm uma<AngleBracket>
sintaxe de asserção de tipo que entra em conflito com a gramática JSX. Para evitar quebrar uma tonelada de pessoas, usamos.tsx
para JSX, e adicionamos afoo as Bar
sintaxe que é permitida em ambos os arquivos.ts
e.tsx
.E a outra é a sintaxe como:
Podemos usar .ts com,
as-syntax
mas<string>someValue
é legal!fonte