Migrar do JavaScript para o TypeScript na Slack tem sido um desafiador, mas dramaticamente benéfico segundo escreveu o engenheiro desktop na Slack Felix Rieseberg.
A equipe do Slack decidiu migrar para o TypeScript para facilitar o gerenciamento da vasta base de código JavaScript que possuem, e após desistir do uso do JSDoc para documentar as assinaturas de funções, descrever como usar, etc. Em particular, Rieseberg diz ser difícil seguir a abordagem do JSON em uma base de código já existente, uma vez que requer estrita disciplina ao modificar o código e também porque nem sempre é fácil saber qual é o tipo esperado, por exemplo, o que uma promessa (promise) resolve.
Uma das razões pela qual a equipe do Slack escolheu o TypeScript é o fato dele ser um super conjunto de ferramentas JavaScript, tornando possível sua adoção sem mudar uma única linha de código e então gradualmente habilitar funcionalidades como análise de código e incluir as definições de tipo disponíveis para vários pacotes. Ao longo do tempo, eles chegaram ao ponto de habilitar opções avançadas do compilador, como --noImplicitAny para prevenir o compilador de inferir o tipo any. No geral, Rieseberg disse que demorou aproximadamente seis meses para anotar a maioria do código base da app desktop. Durante o processo, o compilador descobriu vários bugs e acelerou o desenvolvimento graças aos avançados recursos de edição, como por exemplo, o recurso auto-completar.
O InfoQ falou com Rieseberg para descobrir mais sobre sua experiência.
Você descreve uma abordagem gradual para habilitar as opções do compilador do TypeScript. Poderia nos fornecer mais detalhes sobre quais opções podem ser habilitadas desde o início, e quais requerem mais trabalho no código existente?
Acredito que o tipo any é um dos argumentos mais fortes para mover uma base de código para o TypeScript. Isso permite uma substituição gradual de todas as declarações any por tipos mais específicos e interfaces ao longo do tempo. À medida que cresce o uso de tipos, mais cedo ou mais tarde as abstrações oferecidas pelos tipos de interseção e união serão apreciadas, o que pode ser assustador para os desenvolvedores novatos ao sistema de tipos. Em minha opinião, uma adoção gradual do TypeScript é principalmente alimentada por aceitar JavaScript existente - O TypeScript tentará entender o seu código e suportar o desenvolvimento tanto quanto possível, e não se recusará a ajudar se você não tem tempo para migrar toda sua base de código de uma vez.
Passar de uma linguagem dinamicamente tipada para uma linguagem estritamente tipada pode abrir oportunidades para redesenhar as coisas. Você já teve esta experiência no Slack?
Nossa conversão para o TypeScript foi feita em sua maioria por nosso desenvolvedor OJ Kwon, que começou o trabalho logo após se juntar a equipe. Ele encontrou várias oportunidades para melhorar a base de código. Particularmente, portar o código para o TypeScript nos ajudou a entender um pouco melhor o fluxo de dados dentro de nossa arquitetura, mas em uma perspectiva mais ampla, revisitar código existente é sempre um convite para repensar a abordagem tomada.
No nível da linguagem, quais destas funcionalidades os ajudou a construir um sistema de tipos expressivo?
Eu particularmente gosto da declaração merging, que nos permite reutilizar tipos e declarações existentes para expressar os objetos com os quais estamos lidando. Além disso, embora certamente menos interessante, os tipos literais de string podem ser encontrados em toda parte em nossa base de código.
Um dos pontos fortes do TypeScript que você destaca é o fato de ele ser um superconjunto de JavaScript. Por outro lado, significa que você não pode ter certeza absoluta sobre nada que você recebe da camada JavaScript pura de sua app. Qual a sua abordagem para isso? Foi problemático de alguma maneira?
É importante dizer que o TypeScript vem com o Salsa, que é um servidor de desenvolvimento que fornece experiência TypeScript ao trabalhar com JavaScript. Esta é a engine que permite que o Visual Studio Code entenda seu JavaScript. Nos demos bem com a combinação de TypeScript, arquivos de declaração e o uso do Salsa durante o desenvolvimento. Eu particularmente gosto da abordagem do TypeScript em relação a arquivos de definição.