DROPS: Me desculpa, não vejo vantagens no Typescript!
Talvez seja algo que funcione super bem para você, mas para mim é algo desnecessário e teria me salvado em tão poucos casos, que não compensa com o ganho que tive sem usar.
Primeiro preciso fazer um disclaimer aqui, se o build demora mais de 3s para mim é problema e inclusive deixei de trabalhar com Java, porque não conseguia desenvolver uma aplicação já que me distraia durante o build e demorava um bom tempo para eu voltar o foco e testar algo.
Eu tenho quase todos os sintomas de quem tem TDAH e isso faz com que programar com ferramentas que dependendam de um build seja bem complicado.
Dito isso, você já entende talvez a razão do porque eu não vejo vantagens em quase nada que tenha essa etapa do maldito build e por ter gostado tanto de JS, no que máximo de build que tinha era um F5 na página.
Mas os tipos são importantes! Não são, dane-se os tipos JS já automatizou isso para mim. O que você diria de um desenvolvedor que usa goto, ou eval em JS? Eu diria que é um idiota e o mesmo se aplica para aquele que faz reatribuições de variáveis em JS. Entenda por reatribuições de variaveis você receber um número e usando let adiciona uma string nela.
Mas a linguagem tipada evita bugs! Mentira, sabe o que evita bugs? Responsabilidade única, testes unitários e code review. Para isso vou deixar você com esse texto do Eric Elliott falando do custo do Typescript. E além do custo mencionado pelo artigo, tem outro de que os módulos ficam cada vez maiores com arquivos muitas vezes desnecessários.
Mas tipos melhoram a leitura do código! Então vou colocar aqui alguns exemplos com e sem typescript e você me fala qual a leitura fica melhor.
const sum = (accumulator, value) => {
accumulator += value;
return accumulator;
}
const values = [5, 5, 5];
const result = values.reduce(sum, 0);
console.log(result);
const sum = (accumulator:number, value:number):number => {
accumulator += value;
return accumulator;
}
const values = [5, 5, 5];
const result = values.reduce(sum, 0);
console.log(result);
Novamente me desculpem, talvez seja o viés de familiaridade, mas não consigo imaginar você lendo esse texto e a cada palavra quebrando a leitura pelo tipo dela.
Algo:pronome indefinido como:advérbio essa:sufixo frase:substantivo feminino e:conjunção não:advérbio quero:verbo ler:verbo código:substantivo masculino assim:advérbio, talvez:advérbio eu:pronome seja:conjução muito:pronome indefinido burro:substantivo masculino para:preposição ser:verbo desenvolvedor:substantivo e:conjunção querer:verbo simplificar:verbo coisas:substantivo feminino.
É open-source! Mas é da Microsoft, não sou fã de grandes corporações, mesmo que elas se digam amigas do open-source. Se ela é tão amiga assim, porque não abre o código do office ou Windows? E não é porque a IBM mudou que deixo passar o apoio dela aos Nazistas por exemplo e porque deixaria passar o que Microsoft fez com a Netscape e como 12 anos atrás era a Microsoft que mais dificultava a vida de quem desenvolvia para web.
JS sem sofrimento
Eu sei JS tem várias questões que transformam a linguagem em sofrimento. Principalmente para quem está acostumado com linguagens fortemente tipadas e estruturadas ao invés de multi-paradigmas. Mas vamos para algumas dicas.
No Browser, você sempre interage com strings, com excessão dos casos em que você fez a conversão implícita e não percebeu por exemplo no código abaixo.
const value1 = document.getElementById('value1');
const value2 = document.getElementById('value2');
const result = value1 + value2; // Conversão acontecendo
Para facilitar ou deixar mais explicito o tipo caso seja necessário você pode encarar o acesso a dados externos da seguinte forma:
const value1 = Number(document.getElementById('value1'));
const value2 = Number(document.getElementById('value2'));
const result = value1 + value2; // Conversão acontecendo
No NodeJS, vai depender da declaração ou item que você acessa, mas no geral são sempre os tipos primários que vamos falar só sobre eles
Tipos primários
JS tem os seguintes tipos, string, number, boolean, undefined, null, object, e os novatos Symbol e BigInt. Estude o comportamento deles quais conversões a engine de JS precisa fazer para cada um deles.
Mas de forma breve, toda conversão terminar em boolean para a determinar a calcular a expressão escrita. Logo uma string vazia ''
é undefined
e undefined
se torna false
. E todo valor 0
vira false
e aqui mora um problema grande. Quando precisamos preservar o zero. Para preservar o zero transforme ele em string, você pode usar String(0)
ou ''+0
.
Saber dessa regra para tipos primitivos já se torna uma grande mão na roda, aqui segue formas pouco legíveis de fazer cast de tipos em JS.
// String para número
const num = +'300';
console.log(num); //300
console.log(typeof num); // 'number'
// numero para string
const str = ''+300;
console.log(str); // '1'
console.log(typeof str); // 'string'
// string para boolean
const bool = !!'300';
console.log(bool); // true
console.log(typeof bool); // 'boolean'
// boolean para number
const num = +true;
console.log(num); // 1
console.log(typeof num); // 'number'
// boolean para string
const str = ''+true;
console.log(str); // 'true'
console.log(typeof str); // 'string'
E algumas vezes você talvez precise usar um typeof
aqui ou ali para checar o tipo de alguma variável, mas mantendo a imutabilidade sempre que possível será bem raro, já que uma vez declarado um tipo primitivo, você consegue determinar ele, mesmo quando ele for só referenciado.
Esse texto foi inspirado em uma conversa que tivemos no grupo da Guilda, se quiser me encontra lá https://t.me/guildatech. E dúvidas sugestões e criticas pode falar comigo, lá no Github, Twitter ou Telegram (@flpms)