Recentemente li um artigo no tableless sobre TypeScript chamado Diga olá ao TypeScript e adeus ao JavaScript e fiquei meio noiado tanto com o que estava escrito quanto com os comentários que eu li sobre a peça.

Eu, assim como o autor do artigo, também sou super fã de TypeScript e acho uma iniciativa mega legal da Microsoft. A linguagem começou a ficar mais famosa aqui no Brasil ao ser adotada pelos desenvolvedores do Angular 2 e assim como tudo mais que acontece no nosso país esse assunto virou briga de torcida organizada onde algumas pessoas parecem acreditar que para gostar de TypeScript é necessário não gostar de JS e vice versa, isso não faz sentido nenhum. Existem vários pontos no artigo e nos comentários que são más interpretações do JS e seu ecosistema. Pretendo falar a respeito de alguns desses pontos.

Qual foi do FUD com JS?!

Para começar o título do artigo: Diga olá ao TypeScript e adeus ao JavaScript é digno do buzzfeed. JS não está indo embora para lugar nenhum, alias como já falava ~Chesus~ o Jaydson, JS tá em todos os lugares. Todo computador, seja desktop ou laptop, possui um browser e roda javascript. Todo smartphone possui um navegador e um engine de JS. Todos os smartwatches rodam JS. As televisões modernas (webOS, Tizen, Android TV, Firefox OS) rodam JS. O PS3, XBox, PS4, Wii e Wii U rodam JS. Um zilhão de placas de IoT rodam JS. JavaScript não está indo embora para lugar nenhum.

Bom, você conhece um código javascript minificado+comprimido+”esculachado” - o autor do artigo

Minificado e comprimido nada tem a ver com JS para começar. Você tem compressores e minificadores de código para tudo que é linguagem. Os minificadores e compressores de JS ficaram famosos pois são úteis. Eles reduzem a largura de banda necessária para transferir o código para sua máquina. Isso minifica os problemas de latência entre o inicio do request e a execução do código.

Esculachado?! Estamos na quinta série agora?! Da onde saiu isso? Eu sei que está ali em uma tentativa de alívio cômico ou de se auto afirmar através da diminuição da tecnologia alheia mas por favor né, se é para criticar JavaScript existem formas mais úteis que esculachado. Existem códigos em JS tão bem escritos que dá vontade de emoldurar na parede, da mesma forma que existe lambança em tudo que é linguagem.

... aquele código “malucão” em JavaScript ... - o autor do artigo

Único comentário, a maluquice de uns é a sabedoria dos outros.

Incompreensões sobre JS e tipos

"felizmente chegamos ao ponto que podemos tratar o javascript como uma linguagem tipada e semelhante ao c/java/php e derivados." - o autor do artigo

Repitam comigo: Sintaxe é diferente de semântica! Sintaxe é diferente de semântica!. Não confundir anotação de tipo com uma CPU ou VM que suporta semântica de tipo. O artigo demonstra super bem a utilização de tipos em TypeScript porém se equivoca quando fala de tipos em JS e de tipos em geral. As pessoas não colocam anotações de tipo por que acham bonito. Em linguagens como C, elas colocam por duas razões:

  • a estrutura do código compilado utilizado pela CPU faz com que seja necessário saber o tipo das coisas afinal o código não é interpretado e existem espaços e rotinas diferentes no microcódigo da CPU e seus mecanismos auxiliares para lidar com os diferentes tipos.
  • Pra dar erro!!!! Sério, a função secundária de se colocar tipo nas coisas é pra dar merda. Você (o dev) quer que o compilador exploda na sua cara caso uma variável ou função receba um tipo diferente daquele que foi anotado. O código anotado garante em tempo de compilação (nas linguagens corretas) que as variáveis e funções estão recebendo os valores teoricamente corretos e portanto seu app tem chances menores de bugs em tempo de execução.

O lance que o TypeScript possui anotações de tipo e o compilador verifica essas anotações na hora da transpilação para JS assim diminuindo a superficie de contato onde seus bugs germinarão. Mas o código ainda assim irá rodar em uma VM onde os tipos são inferidos em tempo de execução pois JS não é uma linguagem tipificada (em tempo de compilação).

Alias, o autor nem fala de asm.js que é um subset de JS super otimizado, com garantia de certos tipos, que permite inclusive que esse subconjunto de JS execute sem as pausas coleção de lixo aleatórias assim atingindo performances incríveis. Se é pra falar de tipos em JS então tem que falar de asm.js e Typed ArrayBuffers.

Não entender herança em JS

JS sofre do mal do sucesso e da fama. A Web atrai startups, empresas e um ecosistema gigante de desenvolvedores que se formaram em outras escolas que não a do JS e seus semelhantes. Essas pessoas aprendem Orientação a Objetos em Java e C++ e acham que a vida é assim. Elas não entendem que a herança em JS não é OOP mas sim herança prototípica.

Herança Prototípica OOP
SELF SmallTalk
NewtonScript C++ (jokes)
Io Objective-C
REBOL Java
Lua Python
JS Ruby

As pessoas acham que pra ter objetos é necessário ter classe, instância, mixins, métodos públicos, privados, protegidos e toda uma bagagem que elas aprendem com Java/C++ mas nada disso se aplica a semântica da herança prototípica de JS. É um caso de não entendi e não quero entender que vemos todo santo dia. Toda vez que um desenvolvedor faz uma framework para macetar OOP em JS um golfinho cai dentro uma closure e nunca mais é visto.

Por exemplo, o autor cita esse exemplo de TypeScript:

interface IComponent{
    getId() : string;
}

class Button implements IComponent{
    id:string;
    getId():string{
        return this.id;
    }
}

E mostra a conversão em:

var Button = (function () {
    function Button() {
    }
    Button.prototype.getId = function () {
        return this.id;
    };
    return Button;
})();

Chamando o código JS de feioso (isso mesmo, argh). O que ele não conta é que esses códigos não são equivalentes. No código TypeScript ele define uma interface, que é como um contrato, e uma classe, que é uma planta baixa para um objeto, ambos inúteis pois sem um objeto instanciado nada daquilo ali está vivo. Agora o código em JS já é vivo, o objeto Button é um objeto real e alocado, seu membro getId() acessável através de seu protótipo.

Na herança prototípica, você não precisa criar instâncias para ativar uma classe. Os objetos já são criados e ligados uns aos outros via a cadeia de protótipos. Alias, aquele código poderia ser escrito como:

function Button() {
}

Button.prototype.getId = function () {
    return this.id;
};

var meuBotao = new Button();

O código acima é menor, mais legível e mais simples que o anterior em OOP. A versão gerada pelo TypeScript simplesmente usa uma IIFE para capturar aquelas definições em um escopo léxico e só deixar o objeto final vazar para fora desse escopo.

As pessoas vindas de linguagens como C/C++/Java não só desconhecem o padrão de desenho IIFE mas também não estão acostumadas ao escopo léxico em geral estando mais familiarizadas com escopo de bloco. Em resumo, frente a padrões novos de desenho, paradigmas novos de herança e escopo, é até razoável entender por que as pessoas tratam o desconhecido como feio. Pessoalmente, eu prefiro herança prototípica que OOP mas até ai eu já programei em NewtonScript, Lua e REBOL então pra mim protótipos sempre foram a norma.

Tem gente que prefere escrever assim, vai entender né. - o autor em relação ao código gerado pelo TypeScript

Eu entendo muito bem quem prefere escrever daquele jeito pois isso demonstra uma compreensão da maquina virtual que está rodando o código. O autor sabe que deve capturar as variáveis em um escopo léxico, que isso facilitará o debug e a coleção de lixo. Ele também sabe como funciona a cadeia de protótipos. O mal do século é não entender como JS funciona e ainda assim ficar tentando transpilar o mundo para ele.

Tão grande é a falta de compreensão ali no artigo que o autor cita:

"O conceito de classes no TypeScript é o mesmo de uma classe em qualquer linguagem orientada a objetos. As classes no TypeScript seguem o padrão ECMAScript 6 que em teoria será o “futuro” do JavaScript." - o autor do artigo

Repitam comigo: Sintaxe é diferente de semântica! Sintaxe é diferente de semântica!. A nova sintaxe de classes do ES6 não cria um sistema novo de orientação a objetos, ela é apenas uma forma nova de escrever porém o que acontece é a mesma herança prototípica que eu amo. Mudar a sintaxe, não muda o que acontece na VM magicamente. Simplesmente economiza palavra e torna o código mais claro mas dai a confundir com herança de OOP está errado.

Nem vou reclamar da sessão sobre accessors pois todo mundo sabe que JS possui getters e setters desde 2006 quando foi lançado o Firefox 2.

O lance é, o artigo cita diversas coisas como se a semântica da VM fosse mudar, como se TypeScript tivesse substituindo algo que não pode ser feito em JS, como se JS fosse feioso ou bobo sem no entando demonstrar entender como essas coisas funcionam e isso leva ao segundo problema que é muito mais importante do que falamos até agora

O meu é maior que o seu!!!!

Ai graças a um artigo cheio de imcompreensões sobre JS e adjetivos como feioso, malucão, chegamos a parte dos comentários onde a galera logo se dividiu em pró-JS e contra-JS-pró-TS... WTF??!?!?!? Tudo nesse país tem que virar briga???? PRA QUE?!!??!

Primeiro, TypeScript é super bacana, o autor está mais do que certo nisso! Fez um ótimo trabalho na hora de demonstrar as funcionalidades da linguagem e eu sinceramente quero ver os próximos artigos. Isso não significa que para TypeScript ser bacana, o JS precisa ser ruim.

Lembrem-se que TypeScript é um superset de JS e inclui tudo que o JS já tem. Falar Diga olá ao TypeScript e adeus ao JavaScript é a mesma coisa que falar Diga olá para a Nutella e adeus para avelã e cacau, PORRA, NUTELLA É FEITA DE AVELÃ E CACAU!!!!! TypeScript é feito de JS. TypeScript não é algo que roda em JS como bytecode. TypeScript é JS. É como se quando o Mario pega a flor e passa a atirar bola de fogo você falasse que ele não é mais o Mario!!!!

Tem uma infinidade de Javeiro/PHPeiro/Czeiro/C++eiro na thread falando absurdos de JS sem nem entender como a linguagem funciona e tem um bando de fã de JS batendo de volta como se TypeScript não merecesse atenção (dica: merece sim).

"Javascript é gambiarra, programadores de verdade sabem disso." - trecho de um comentário bobo

Programadores de verdade sabem que linguagens são ferramentas apenas e não ideais platônicos da verdade e da justiça! Depois que você constroi uma estante ninguém pergunta a marca do martelo. JS tem first-order functions, closures, herança prototípica, maquinas virtuais super performáticas, uma abrangência em termos de dispositivos nunca antes alcançada. JS tem uma infinidade de features em termos de programação que várias linguagens ditas de programadores de verdade até hoje desconhecem.

"#partiu angular 2 com TS, vai ser a bola da vez em 2016." - o autor do artigo respondendo a baboseira citada acima

O autor fica falando de TypeScript como se o grande mérito da linguagem fosse o Angular 2. Em nenhum momento ele cita que a linguagem foi desenvolvida pela Microsoft, que durante anos foi a Microsoft que colocou esforço e dinheiro nesse superset (que junto com C#, F# e M# fazem parte do conjunto de linguagens fodaralhassas desenvolvidas lá). Cadê o dar nome aos bois?

"Aviso importante para quem está começando/aprendendo javascript: pulem esse artigo." -- outro comentário

Não! Não! Não! TypeScript é maneiro! Não precisa deixar de se interessar pela linguagem só por que voce está aprendendo JS. Pelo contrário, estude JS e aprenda como sua engine funciona e então você terá uma compreensão melhor sobre o que o TypeScript está fazendo. A diferença entre o motorista de carro e o mecânico, um deles sabe o que acontece dentro do motor além de saber dirigir o carro.

"Eu tbm parei de ler o Tableless... Ai acabei me lembrando agora porque eu parei de ler... Que artigo mais sem noção..." - outro comentário

Então tem uma enxurada de violência de internet com comentários dessa natureza. Nada disso ajuda a comunidade. Se alguém não está de acordo com os artigos do Tableless então em vez de xingar muito no Twitter que tal contribuir com algum artigo que seja mais afinado com o que você deseja ler? Eu não gostei do artigo apesar de curtir TypeScript, eu não vou parar de ler o tableless ou ficar tretando com o autor, eu vou sim escrever esse feedback que estou escrevendo e ver se tem alguma forma de contribuir um artigo sobre herança prototípica para o Tableless pq parece que até hoje a galera não entende o assunto.

É triste ler tanto comentário idiota de pessoas qua acham saber do que estão falando. Estou estudando angular 2.0 e não se compara a facilidade que o type gera ao desenvolver. (...) é bom se acostumarem pois esse é o rumo que a web está tomando. Estruturas como a do typescript serão cada vez mais comum.

Todo mundo sendo expert no futuro... sim TypeScript é super gostoso de desenvolver, eu mesmo também adoro. So que o que falta ai é que o engine ainda é o mesmo, a semântica é a mesma, você só entupiu de syntatic sugar e tooling para ficar mais confortável para a galera de Java e C# mas ainda é JS e isso não muda. A Web está tomando um rumo sim, está tomando o rumo do ES6 e esse é um rumo que mantém a herança prototípica, mantém a tipagem fraca, mantém IIFE, closure, hoisting, escopo léxico (mas tem o let pra dar uma fugida) e todas as outras coisas do JS normal.

Então fica aqui meu apelo para o autor do artigo e para os autores dos comentários: Que tal começarmos o ano com menos flamewars e FUDs?. Que tal escrevermos sobre uma tecnologia sem desmerecermos outra? Que tal em vez de xingarmos para caralho, escrevermos críticas construtivas e melhor ainda, escrevermos mais conteúdo mostrando novos lados, interpretações e paradigmas. O mundo da Web é muito rico, nosso ecosistema tupiniquim é sensacional, juntos podemos muito mais!