Javascript

Precisamos falar sobre o TypeScript

O TypeScript é um caso interessante. Ou você o adora ou o odeia. Parece não haver um consenso intermediário de maneira geral na comunidade. Vamos conversar um pouco sobre?

há 7 anos 2 semanas

Formação Desenvolvedor JavaScript
Conheça a formação em detalhes

Ultimamente muita gente tem torcido o nariz para um novo superset do JavaScript. Sim, estamos falando do TypeScript.

O TypeScript é um caso interessante. Percebo ultimamente que, ou você o adora (o que é meu caso) ou você simplesmente o odeia. Parece não haver um consenso intermediário de maneira geral na comunidade. Por que será que isso acontece? Será que existem conceitos errôneos difundidos na comunidade sobre o TypeScript? Será que ainda há pontos cruciais a serem melhorados nele? Vamos discorrer sobre isso! :)

Webpack - Empacotando aplicações
Curso Webpack - Empacotando aplicações
Conhecer o curso

É da Microsoft…

Prédio da microsoft

Acho que esse ponto talvez seja o mais complicado de se discutir. Muita gente simplesmente tem ódio do TypeScript simplesmente por ele ser da Microsoft. Em minha opinião, acho que é simplesmente perda de tempo deixar de utilizar alguma tecnologia por ela ser de alguma empresa específica. Acho que a qualidade técnica e a maneira como a companhia conduz a plataforma, além dos fatores externos (infraestrutura, contratos comerciais, etc.), deveriam ser os fatores cruciais para se decidir se determinado framework/linguagem/plataforma será adotada ou não. Porém, sabemos que por muitas vezes a paixão toma lugar da razão nesse tipo de tomada de decisão (eu comentei um pouco sobre esse tipo de cenário no artigo Não seja um profissional “intolerante”.

Eu concordo que a conduta que a Microsoft tinha há algum tempo não era a mais adequada com relação aos desenvolvedores. Mas também precisamos reconhecer que essa postura nos últimos anos mudou da água para o vinho! Em pouco mais de cinco anos, a Microsoft se tornou a maior contribuidora em software open source no GitHub. Duvida? Você pode comprovar através do próprio GitHub.

A Microsoft também se tornou uma das principais contribuidoras do kernel Linux. Ela ainda tem disponibilizado uma série de ferramentas que antes eram licenciadas (caso do Visual Studio e do Xamarin, por exemplo) de maneira completamente gratuita. As principais plataformas da Microsoft (o que inclui toda a plataforma do .NET Core e o próprio TypeScript) estão abertos no GitHub. Não há mais motivos para achar que a Microsoft “tem um plano maquiavélico/diabólico/capitalista de dominar a indústria de software” (embora esse acabe sendo um objetivo indireto de qualquer empresa no fim das contas).

A Microsoft mostra atualmente que já entendeu que ela precisa se tornar parte do mundo open source, além de já ter provado que sim, ela tem muita coisa interessante para a comunidade. Para mim, isso tudo reforça que essa mania de falar que o que é da Microsoft é ruim deveria já ter ficado no passado.

O TypeScript não quer substituir o JavaScript

Um rapaz programando

Algumas pessoas que eu conheço têm pavor do TypeScript porque acham que ele vem para substituir o JavaScript, o que é um equívoco. O TypeScript nunca teve a intenção de substituir completamente o JavaScript. A própria documentação diz que ele é na verdade um superset do JavaScript. E o que isso quer dizer? Isso quer dizer que ele visa fornecer alguns recursos que o JavaScript não oferece por padrão. Entre esses recursos, temos por exemplo:

  • A oportunidade de termos tipos de dados mais definidos (tornando o JavaScript um pouco mais tipado);
  • Uma sintaxe e estrutura fortemente orientados à objetos (o TypeScript é fortemente influenciado pelo C# e F#), aproximando a experiência de desenvolvimento de linguagens tradicionalmente orientada a objetos como o C# e o Java;

Essas vantagens, por decorrência, trazem outras vantagens:

Por causa da existência de tipagem e também de uma sintaxe mais clara, as IDEs ganham a possibilidade de aprimorarem seus mecanismos de detecção de erros e de sintaxe em tempo de desenvolvimento. Isso quer dizer que, usando TypeScript, sua IDE poderá lhe avisar de alguma passagem de tipo incorreta ou mesmo sobre alguma sintaxe incorreta enquanto você ainda escreve o código. Ferramentas como o IntelliSense (conhecido por muitos como AutoComplete) também podem ser bem mais efetivas nesse cenário. Não quero dizer que, quando utilizamos JavaScript “convencional”, as IDEs não ofereçam esse tipo de suporte, mas o suporte das IDEs para o TypeScript é ou pelo menos tem a grande tendência de ser bem mais aprimorado;

Ainda temos, como decorrência do ponto anterior, a possibilidade de que o código escrito com TypeScript seja bem mais robusto, seguro e fácil para ser testado. Isso tudo, mais uma vez, graças aos conceitos de linguagens estáticas e tipadas que o TypeScript trouxe para o mundo das linguagens funcionais, na minha opinião, no nível certo. TypeScript não é JavaScript simplesmente tipado e estático, ele torna possível utilizar o melhor do mundo de linguagens de tipagem fraca e funcionais e do mundo de linguagens estáticas e de tipagem forte;

Aqui já é uma opinião bem mais pessoal, mas eu prefiro a sintaxe do TypeScript que a sintaxe do JavaScript, principalmente no que tange à orientação a objetos. Eu gosto das “regras de sintaxe” e a pseudo-tipagem que o TypeScript traz para o JavaScript. Ou você realmente acha que isso:

var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Animal = (function () {
    function Animal(name) {
        this.name = name;
    }
    Animal.prototype.move = function (distanceInMeters) {
        if (distanceInMeters === void 0) { distanceInMeters = 0; }
        console.log(this.name + " moved " + distanceInMeters + "m.");
    };
    return Animal;
}());
var Snake = (function (_super) {
    __extends(Snake, _super);
    function Snake(name) {
        return _super.call(this, name) || this;
    }
    Snake.prototype.move = function (distanceInMeters) {
        if (distanceInMeters === void 0) { distanceInMeters = 5; }
        console.log("Slithering...");
        _super.prototype.move.call(this, distanceInMeters);
    };
    return Snake;
}(Animal));

… é mais claro que isso?

class Animal {
    constructor(public name: string) { }
    move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

class Snake extends Animal {
    constructor(name: string) { super(name); }
    move(distanceInMeters = 5) {
        console.log("Slithering...");
        super.move(distanceInMeters);
    }
}

Agora, nada impede de você utilizar JavaScript “tradicional” em conjunto com o TypeScript, mesmo porque no final o TypeScript é transpilado para JavaScript! No final, tudo vira JavaScript… Veja que no exemplo acima mesmo isso ocorre quando utilizamos o tradicional console no meio do código TypeScript. Isso reforça que a idéia da Microsoft não é substituir o JavaScript, nem nunca vai ser! A idéia é podermos ter a possibilidade de utilizar um ferramental mais poderoso para produzir um código mais robusto e legível.

Agora terei um código muito verboso

Cidade com congestionamento de veículos

Não há como negar isso. As características técnicas (tipagem, vocação para orientação à objetos, etc.) fazem naturalmente que o código TypeScript torne-se um pouco mais verboso e com menos vocação para o lado funcional, principalmente para quem vem de linguagens fracamente tipadas e/ou funcionais. Na verdade, no final, o TypeScript faz uma mistura entre os conceitos dos dois paradigmas (funcional e orientado a objeto) e dos dois sistemas de tipagem (fracamente tipado e fortemente tipado).

E aí, já viu: isso pode provocar tanto admiração como também raiva. Algumas pessoas podem gostar bastante dessa mistura (meu caso) ou outras podem simplesmente odiar (já que o TypeScript corre o sério risco de desagradar tanto os adeptos do paradigma funcional como também do paradigma orientado à objetos). Temos verbosidade no TypeScript sim, mas ainda sim temos aspectos funcionais também presentes.

O TypeScript ainda não consegue lidar bem com todas as bibliotecas JavaScript

Uma ponte de madeira danificada

JavaScript - Orientação a objetos
Curso JavaScript - Orientação a objetos
Conhecer o curso

Para que o TypeScript consiga “conversar” com as APIs de outras bibliotecas (por exemplo, o jQuery), ele precisa de um arquivo com a extensão *.d.ts. Este arquivo, conhecido como TypeScript Type Definition, traz os mapeamentos necessários para que através do TypeScript você possa acessar e utilizar os métodos expostos por uma biblioteca externa, mesmo que esta não tenha sido escrita com o TypeScript. Esse arquivo acaba funcionando como uma ponte entre uma biblioteca externa e o TypeScript.

Aí reside o problema: nem todas as bibliotecas possuem esse arquivo que as prepara para serem consumidas por código TypeScript. As mais famosas bibliotecas já possuem este arquivo preparado, mas se você utiliza uma biblioteca um pouco menos conhecida ou possui uma biblioteca proprietária, ela pode não ser de cara compatível com um código TypeScript de maneira completa. Nesse caso, não há outro cenário: será necessário que você mesmo escreva este arquivo de definições ou abra mão do TypeScript. E isso, de fato, pode vir a ser um empecilho dependendo do projeto…

O TypeScript não é o salvador da pátria

Um boneco do Robin

O TypeScript pode trazer algumas confusões com relação a sua utilização… Já que o código TypeScript no final é sempre transpilado para um código JavaScript “normal”, podemos dizer que todo código JavaScript também é código TypeScript! Isso é legal porque justamente conseguimos ainda ter as características legais do JavaScript com o poder do TypeScript.

Por isso mesmo que o TypeScript não visa substituir o JavaScript, e sim o complementar. Algumas pessoas têm comentado ultimamente, chegando ao (absurdo, na minha opinião) de dizer que hoje TypeScript é a linguagem de alto nível enquanto o JavaScript é o assembly.

É cedo demais para dizer isso; assim como, em minha opinião, nem sempre o TypeScript pode ser a melhor saída. Para se escolher se você deve usar TypeScript ou não, não se esqueça de levar em consideração a quebra de paradigmas que ele pode causar na equipe de desenvolvimento, bem como o suporte às bibliotecas que você pretende utilizar. E esses são somente dois pontos que devemos considerar… TypeScript não é uma bala de prata..

Afinal, devo utilizar TypeScript ou não?

Muro com palavras de questionamento

Mais uma vez, essa é uma questão muito subjetiva, onde não temos o certo e o errado. Tudo vai depender da situação como um todo. Eu gosto da idéia do TypeScript e o utilizo sem problema nenhum: o sistema de tipagem, a sintaxe mais clara e a aliança com o JavaScript (afinal, ainda temos JavaScript como produto final) me agradam bastante. Mas você pode ter uma opinião diferente… No final, nenhum de nós vai estar 100% certo ou 100% errado, hehe.

Agora, eu não acho perda de tempo estudar TypeScript. Para mim, está claro que ele é algo que veio para ficar. Além de tudo, ele ainda está muito alinhado com o ECMA 6, tendo muitos recursos que o ECMA 6 propõe. E tem mais um tempo: alguns frameworks, como Angular e Ionic, estão adotando o TypeScript, assim como outros estão pelo menos oferecendo suporte a ele. Por essas e outras, o TypeScript veio para ficar.

Melhor para nós! Mais uma opção de ferramenta legal que podemos utilizar em nossos projetos. :) Que a guerra dos frameworks/bibliotecas/supersets do JavaScript continue! o/

Você quer aprender TypeScript? Veja esse nosso incrível curso:

Autor(a) do artigo

Cleber Campomori
Cleber Campomori

Líder de Conteúdo/Inovação. Pós-graduado em Projeto e Desenvolvimento de Aplicações Web. Certificado Microsoft MCSD (Web).

Todos os artigos

Artigos relacionados Ver todos