Existe uma ferramenta para converter arquivos JavaScript em TypeScript [fechado]


133

Agora, o TypeScript foi lançado, é uma notícia emocionante para mim, mas como posso converter todos os arquivos JavaScript existentes em TypeScript?


3
Todos os seus arquivos javascript já são arquivos de texto datilografado, pois o texto datilografado é um superconjunto de javascript.
Benjamin Gruenbaum

6
É o oposto de off-topic, converter de uma linguagem de programação para outra é TOTALMENTE uma questão de programação.
Ivan Castellanos

2
@Tony_Henrich Bem, isso deveria ter sido movido para lá em vez de "fechado como offtopic", e o site deve ter uma categoria clara para recomendações de software destinadas a engenheiros de software.
Ivan Castellanos

3
@Tony_Henrich Vamos colocar desta maneira: Este é o melhor resultado na Internet para "converter JavaScript em TypeScript" e a melhor coisa que você pode fazer é fechá-lo de mais respostas e chamar de tópico fora de tópico? Eu acho que esse pensamento restrito será o fim deste site.
Ivan Castellanos

5
ridículo que isso foi fechado como fora de tópico.
bharal 18/03/19

Respostas:


112

Receio que isso seja muito problemático. TypeScript é um superconjunto de JavaScript . Isso implica que todo código JavaScript válido também é código TypeScript válido. O que está errado. O código a seguir está correto no JavaScript, mas cria um erro no TypeScript:

var data={x:5, y:6};
data.z=5;

Você pode obter o comportamento dinâmico do JavaScript declarando os dados como "ambiente"

var data:any={x:5, y:6};
data.z=5;

Agora isso também funcionará no TypeScript. No entanto, você pode alterar a extensão de um arquivo .js para .ts e passar esse arquivo para o compilador TypeScript. Isso realmente me confundiu e fiz a pergunta no canal de IRC do TypeScript no freenode. Aconteceu que o compilador Typescript verifica sua entrada quanto a JavaScript válido e simplesmente não faz nada caso encontre alguma coisa. Intuitivamente, isso parece bom. Você deve conseguir "converter" todo o seu JavaScript em Typescript apenas atualizando as extensões de arquivo e pronto. Infelizmente, isso não funciona conforme o esperado. Vamos supor que você tenha esse código:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;

Edit: Eu apenas tentei compilar isso e não funciona. Sinto muito, parece que me enganei: o compilador TypeScript nem aceita JavaScript puro. Vou tentar descobrir o que deu errado.

Você alterou a extensão do arquivo para .ts e usa a função func no seu outro código. No começo, tudo parece bem, mas depois um erro feio aparece. Você decide que alguma verificação estática de tipo provavelmente o ajudaria e alterou o código para:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;

Mas agora isso não é mais um código JavaScript válido e fará com que o compilador gere muitas mensagens de erro. Afinal, os dados não têm nenhum membro "z". ... Esse comportamento pode ser evitado se o tipo padrão sempre for "qualquer", mas a inferência de tipo for totalmente inútil.

Então, como você resolve esse problema? A resposta é: arquivos de declaração. Você pode usar o código JavaScript "como está" no projeto e ainda obter a verificação de tipo estático com a ajuda de alguns arquivos .d.ts. Eles informam ao compilador quais variáveis, métodos e "classes" são declaradas em um arquivo JavaScript, incluindo seus tipos. Portanto, eles permitem a verificação do tipo em tempo de compilação e um fantástico senso de senso. Um arquivo .d.ts para o meu exemplo seria

declare var data:any;
declare function func(n:string);

Salve isso como "myjsfile.d.ts" e importe-o para texto datilografado com

///<reference path="myjsfile.d.ts"/>

lembre-se de incluir o script JavaScript no seu arquivo html acima do texto datilografado compilado. Aqui está um link interessante . Você pode estar interessado na seção "Transformando JavaScript em TypeScript".


57
+1 por indicar que nem todas as JS válidas são TS válidas.
Ken Smith

14
Na verdade, todos os trechos de javascript que você postou são tipos de texto válidos. Você só precisa desligar alguns compilador muda como --noImplictAny, etc. No entanto, a sua boa ideia para transformá-los em, eventualmente, e adicionar as anotações de tipo sempre que necessário
Liero

Obrigado. Não recebo nada além de argumentação quando digo às pessoas que o TypeScript não é um superconjunto de JavaScript, independentemente do exemplo que forneço. Eventualmente, as pessoas desistem do argumento quando eu lhes mostro o porquê e, em seguida, discutem o mesmo na semana seguinte, como se para esquecer a prova no pudim. " todo código JavaScript válido também é código TypeScript válido ... está errado " - LHK
Cody #

3
Com o TypeScript permitindo a compilação em JavaScript, apesar dos "erros" do TypeScript (na versão demo atual do TypeScript, todos os exemplos de JavaScript nesta resposta não têm problema em compilar), meio que funciona como um superconjunto - pelo menos daqueles recursos JavaScript que o compilador typescript é capaz de lidar ...
Brett Zamir

Sim, eu "estive nos dois lados" desta questão. Basicamente, TS é um superconjunto de JS no sentido de que: O TypeScript reclama de algum código JS válido, mas enquanto noEmitOnErrorestiver desativado, ele ainda pode operar e emitir sua transpilação. Portanto, embora mostre erros (o que é perturbador), você pode realmente ignorá-los e usar a transpilação TypeScript apesar dela (permitindo, por exemplo, a transição gradual de JS para TS). Além disso, pelo menos alguns dos erros podem ser desativados por meio de switches como noImplicitAny(talvez todos, embora o IDK).
Venryx

51

Atualização: a ferramenta é descrita em detalhes nesta publicação

O ReSharper a partir da versão 9 ( compilações EAP disponíveis ) possui funcionalidade para converter automaticamente o código JavaScript em TypeScript. Você pode começar com a renomeação do arquivo .js em .ts e ver sugestões de R # como esta:

Não tentei em exemplos do mundo real. Mas é capaz de converter um grande número de padrões JavaScript.


Eu adoraria fazer isso em tempo real usando metarquivos editados à mão, criando todo o inchaço do TS necessário.
Xamiro

Olá, estou usando o resharper para renomear apenas multa de .js para .ts apenas? Como eu estou usando um arquivo a.js e renomear arquivo com a.ts é resharper vai dar alguma sugestão? Eu estou usando a versão comunidade visual studio e instalado ReSharper
Swift

1

Do terminal (mac):

for f in *.js; do mv $f `basename $f .js`.ts; done;

Renomeia todos os arquivos .js para .ts

Isso é um tanto irônico - mas, como Benjamin aponta acima, os arquivos JavaScript são TypeScript válidos . Se você deseja adicionar tipos, classes, interfaces, etc. ao seu JavaScript - você mesmo precisará criar e alterar seu código usando esses conceitos - há pouca / nenhuma conversão automática para isso.

Com o GNU findutils (a maioria dos * nixes) + Bash, basta:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;

10
+1 - é como tentar converter um livro resumido de volta para a versão completa automaticamente.
Fenton

Todas as informações de tipo são removidas e todas as interfaces são removidas - muitas informações foram removidas. Qualquer JavaScript que possua informações suficientes para inferir as informações de tipo pode apenas ser colado em um arquivo TypeScript e o compilador resolverá os tipos, mas há muitas instâncias que não funcionarão porque o JavaScript não é consistente.
Fenton

1
Converter do que para o que? Derivando tipos de JS e adicionando-os a vars? Não tenho certeza do que mais poderia ser convertido automaticamente, não tenho certeza de como as classes, interfaces e módulos podem ser derivados (de maneira segura).
precisa saber é o seguinte

4
Nem todo código JavaScript é válido no TypeScript, tente o seguinte:var a = 5; a = "";
coudy 22/13

4
Por outro lado, e justificar o voto negativo, você perceberá muito rapidamente que nem todo código JS é válido no TypeScript ao tentar converter módulos ou plugins em TypeScript a partir de seu JS nativo (por exemplo: jquery.address, etc)
dpb
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.