{"id":5002,"date":"2018-11-07T09:54:27","date_gmt":"2018-11-07T11:54:27","guid":{"rendered":"https:\/\/www.blip.ai\/blog\/?p=5002"},"modified":"2023-08-09T17:26:48","modified_gmt":"2023-08-09T20:26:48","slug":"por-que-usar-typescript","status":"publish","type":"post","link":"https:\/\/www.blip.ai\/blog\/devs\/por-que-usar-typescript\/","title":{"rendered":"Por que usar TypeScript como linguagem de programa\u00e7\u00e3o"},"content":{"rendered":"\n<p>Se voc\u00ea \u00e9 um desenvolvedor front-end, certamente j\u00e1 ouviu falar da linguagem TypeScript. Mas afinal, o que de fato ela \u00e9? Por que usar TypeScript? E ainda, em que tipo de projeto devo utiliz\u00e1-la?<br>Depois de uma boa caminhada utilizando o TypeScript como linguagem principal do meu dia-a-dia de trabalho, tentarei mostrar as principais vantagens de us\u00e1-la nas suas futuras aplica\u00e7\u00f5es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Afinal, o que \u00e9 TypeScript?<\/h2>\n\n\n\n<p>Utilizando a <a href=\"https:\/\/www.typescriptlang.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">defini\u00e7\u00e3o da pr\u00f3pria Microsoft<\/a>, empresa que atualmente mant\u00e9m o TypeScript no <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\" target=\"_blank\" rel=\"noopener noreferrer\">Github<\/a>, \u201cTypeScript \u00e9 um super conjunto tipado do JavaScript que compila para JavaScript puro\u201d.<br>Como voc\u00eas devem saber, o JavaScript puro n\u00e3o tem tipos est\u00e1ticos. A tipagem do JavaScript \u00e9 din\u00e2mica e ocorre em tempo de execu\u00e7\u00e3o.<br><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-5008 size-large\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/1-1024x310.png\" alt=\"por que usar typescript 6\" width=\"1024\" height=\"310\" title=\"-\"><br>O TypeScript \u00e9 uma linguagem que estende os recursos atuais do JavaScript com a possibilidade de <strong>adicionar tipos est\u00e1ticos predefinidos na sua aplica\u00e7\u00e3o<\/strong>, em tempo de compila\u00e7\u00e3o. Ou seja, o exemplo anterior poderia ser reescrito da seguinte forma:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><img decoding=\"async\" class=\"alignnone wp-image-5009 size-large\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/2-1024x310.png\" alt=\"por que usar typescript 6\" width=\"1024\" height=\"310\" title=\"-\"><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Tipagem est\u00e1tica<\/h2>\n\n\n\n<p>Conforme mencionado anteriormente, o TypeScript traz a robustez de uma tipagem est\u00e1tica para aplica\u00e7\u00f5es JavaScript, o que torna <strong>seu projeto muito mais escal\u00e1vel, conciso e com a possibilidade de identificar bugs ainda em tempo de compila\u00e7\u00e3o<\/strong>. Recentemente, no <a href=\"https:\/\/portal.blip.ai\" target=\"_blank\" rel=\"noreferrer noopener\">Blip<\/a>, fizemos uma reformula\u00e7\u00e3o quase que total da nossa base de c\u00f3digo em JavaScript para TypeScript. Isso tornou o nosso c\u00f3digo mais confi\u00e1vel, leg\u00edvel e menos tolerante a falhas.<br>Al\u00e9m de possuir os tipos b\u00e1sicos conhecidos de programadores back-end, como number, string, boolean, object e array, o\u00a0TypeScript tamb\u00e9m possui os chamados <strong>Union Types<\/strong>, que nos permitem a uni\u00e3o entre dois tipos distintos para a cria\u00e7\u00e3o de um novo.<br><img decoding=\"async\" width=\"1024\" height=\"557\" class=\"alignnone wp-image-5007 size-large\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/3-1024x557.png\" alt=\"por que usar typescript 6\" title=\"-\"><br>No exemplo acima, temos um tipo chamado de \u201cDog\u201d e um tipo chamado \u201cCat\u201d, ambos declarando um objeto com duas propriedades. O tipo &#8220;DogOrCat&#8221; \u00e9 um <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/advanced-types.html\" target=\"_blank\" rel=\"noopener noreferrer\">Type Alias<\/a> de uma uni\u00e3o entre os dois tipos declarados anteriormente. Com isso, \u00e9 poss\u00edvel combinar v\u00e1rios tipos na forma\u00e7\u00e3o de um \u00fanico, dando mais flexibilidade \u00e0 vari\u00e1vel que for utiliz\u00e1-lo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Classes<\/h2>\n\n\n\n<p>Nas especifica\u00e7\u00f5es mais recentes do JavaScript (ECMAScript 2015 ou ES6), j\u00e1 \u00e9 poss\u00edvel utilizar a programa\u00e7\u00e3o orientada a objetos utilizando classes e extens\u00f5es. Entretanto, esse recurso <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Classes#Compatibilidade_de_navegadores\" target=\"_blank\" rel=\"noopener noreferrer\">n\u00e3o \u00e9 suportado em browsers mais antigos<\/a>, sendo necess\u00e1ria a utiliza\u00e7\u00e3o de algum <a href=\"https:\/\/babeljs.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">transpilador de Javascript<\/a> para uma especifica\u00e7\u00e3o mais antiga.<br>O TypeScript j\u00e1 faz essa tradu\u00e7\u00e3o para uma vers\u00e3o que browsers mais antigos entendam de forma autom\u00e1tica. Al\u00e9m do mais, \u00e9 poss\u00edvel utilizar modificadores de acesso public, private e protected nos atributos e m\u00e9todos da classe, conforme o exemplo a seguir:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5006 size-large\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/4-1024x533.png\" alt=\"por que usar typescript 6\" width=\"1024\" height=\"533\" title=\"-\"><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Interfaces<\/h2>\n\n\n\n<p>No TypeScript, \u00e9 poss\u00edvel combinar o uso de classes com interfaces, adicionando uma esp\u00e9cie de \u201ccontrato\u201d na implementa\u00e7\u00e3o de uma classe e possibilitando a sua reusabilidade. O interessante nesse caso \u00e9 que <strong>as interfaces em TypeScript n\u00e3o precisam necessariamente ter uma implementa\u00e7\u00e3o<\/strong>, como \u00e9 o caso do Java. A interface pode ser utilizada, por exemplo, em um par\u00e2metro de uma fun\u00e7\u00e3o ou na declara\u00e7\u00e3o de uma propriedade de uma classe.<br>Confira o exemplo abaixo:<br><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5005 size-large\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/5-1024x879.png\" alt=\"por que usar typescript 6\" width=\"1024\" height=\"879\" title=\"-\"><br>Na primeira linha, foi declarada a interface IPerson, que possui dois par\u00e2metros: age e talk. Age \u00e9 do tipo number, e talk \u00e9 uma fun\u00e7\u00e3o que n\u00e3o possui retorno (void).<br>A interface criada pode ser utilizada tanto na implementa\u00e7\u00e3o da classe Person quanto no par\u00e2metro da fun\u00e7\u00e3o renderPerson.<br>Repare que o atributo city \u00e9 opcional. Os demais atributos precisam necessariamente estar implementados na classe Person e estarem presentes nas propriedades do argumento \u201cp\u201d da fun\u00e7\u00e3o renderPerson.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Decorators<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1488\" height=\"598\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457.jpg\" alt=\"por que usar typescript 6\" class=\"wp-image-5016\" title=\"-\" srcset=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457.jpg 1488w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457-300x121.jpg 300w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457-768x309.jpg 768w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457-1024x412.jpg 1024w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457-380x153.jpg 380w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457-800x322.jpg 800w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/45610888_2012684152148714_3765391321527746560_n-e1541610858457-1160x466.jpg 1160w\" sizes=\"(max-width: 1488px) 100vw, 1488px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1496\" height=\"990\" src=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7.jpg\" alt=\"por que usar typescript 7\" class=\"wp-image-5003\" title=\"-\" srcset=\"https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7.jpg 1496w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7-300x199.jpg 300w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7-768x508.jpg 768w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7-1024x678.jpg 1024w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7-380x251.jpg 380w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7-800x529.jpg 800w, https:\/\/www.blip.ai\/blog\/wp-content\/uploads\/2018\/11\/7-1160x768.jpg 1160w\" sizes=\"(max-width: 1496px) 100vw, 1496px\" \/><\/figure>\n\n\n\n<p>Os decorators s\u00e3o extremamente \u00fateis quando h\u00e1 a necessidade de adicionar ou alterar comportamentos de classes, m\u00e9todos, atributos ou assessores (getters e setters). S\u00e3o basicamente o que temos em Java chamado de <strong>annotations<\/strong>.<br>Para exemplificar, vamos criar um decorator para uma propriedade que apenas loga a classe de destino e o nome da propriedade:<br><br>Neste exemplo, toda vez que a propriedade model for acessada, iremos logar o seu nome e a classe na qual ela est\u00e1 sendo inserida. Para exemplificar em um contexto um pouco mais \u00fatil, vamos criar um decorator \u201ctimeout\u201d, que ir\u00e1 executar um m\u00e9todo de uma classe ap\u00f3s x milisegundos definidos como par\u00e2metro:<br><br>Nesse exemplo, o m\u00e9todo start ser\u00e1 executado ap\u00f3s 2 segundos (ou 2000 milisegundos) ap\u00f3s a sua chamada. Dessa forma, conseguimos limpar o nosso c\u00f3digo atrav\u00e9s de uma feature bastante \u00fatil, tornando o nosso c\u00f3digo mais leg\u00edvel. Na <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/decorators.html\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o<\/a> da linguagem, voc\u00ea pode encontrar outras formas de utiliza\u00e7\u00e3o interessantes para o seu dia-a-dia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quem utiliza TypeScript?<\/h2>\n\n\n\n<p>O TypeScript ganhou uma grande ado\u00e7\u00e3o com a populariza\u00e7\u00e3o do <a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Angular<\/a>. A partir da segunda vers\u00e3o, o framework foi totalmente reescrito utilizando essa linguagem, adotando tamb\u00e9m uma nova forma de construir aplica\u00e7\u00f5es.<br>Outro software conhecido pelos desenvolvedores, o <a href=\"https:\/\/github.com\/Microsoft\/vscode\" target=\"_blank\" rel=\"noopener noreferrer\">VSCode<\/a> utiliza em seu c\u00f3digo-fonte tanto o TypeScript como JavaScript puro. O React possui um <a href=\"https:\/\/github.com\/Microsoft\/TypeScript-React-Starter\" target=\"_blank\" rel=\"noopener noreferrer\">starter kit<\/a> para TypeScript tamb\u00e9m.<br>Outra surpresa interessante foi a <a href=\"https:\/\/medium.com\/the-vue-point\/plans-for-the-next-iteration-of-vue-js-777ffea6fabf\" target=\"_blank\" rel=\"noopener noreferrer\">ado\u00e7\u00e3o do TypeScript pelo VueJs nas pr\u00f3ximas vers\u00f5es<\/a>, anunciada pelo project lead do framework em uma confer\u00eancia em Londres. Al\u00e9m das empresas\/frameworks citados acima, aqui no <a href=\"https:\/\/portal.blip.ai\" target=\"_blank\" rel=\"noreferrer noopener\">Blip <\/a>tamb\u00e9m estamos utilizando o TypeScript no nosso front-end e t\u00eam nos atendido muito bem! \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Neste post, tentei responder de forma bem abrangente por que usar TypeScript em suas futuras (ou atuais) aplica\u00e7\u00f5es. Existem muitos pontos positivos ao utilizar o TypeScript, mais especificamente uma linguagem tipada, principalmente quando se trata de aplica\u00e7\u00f5es de grande porte.<br>Entretanto, nem tudo s\u00e3o flores e, na mesma medida em que adicionar tipos na sua aplica\u00e7\u00e3o pode significar uma maior robustez, significa tamb\u00e9m uma maior verbosidade no c\u00f3digo e uma maior curva de aprendizado para novos integrantes do seu time, caso ainda n\u00e3o tenham trabalhado com a linguagem.<br>A escolha desse tipo de stack deve ser baseada em <strong>experimenta\u00e7\u00f5es<\/strong> e, principalmente, em <strong>uma conversa bem alinhada com o seu time<\/strong>. Pontos positivos como a possibilidade do uso de interfaces, identifica\u00e7\u00e3o de bugs em tempo de compila\u00e7\u00e3o, robustez e todos os outros pontos positivos citados devem ser levados em conta, mas pontos negativos como maior curva de aprendizado, alta verbosidade e aumento de complexidade do c\u00f3digo tamb\u00e9m devem ser discutidos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Outras linguagens tipadas que compilam para JavaScript<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>ReasonML &#8211; <a href=\"https:\/\/reasonml.github.io\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"text-decoration: underline;\">https:\/\/reasonml.github.io<\/span><\/a><\/li><li>ELM &#8211; <a href=\"https:\/\/elm-lang.org\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"text-decoration: underline;\">https:\/\/elm-lang.org<\/span><\/a><\/li><li>PureScript &#8211; <a href=\"https:\/\/www.purescript.org\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"text-decoration: underline;\">https:\/\/www.purescript.org<\/span><\/a><\/li><li>Flow &#8211; <a href=\"https:\/\/flow.org\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"text-decoration: underline;\">https:\/\/flow.org<\/span><\/a><\/li><\/ul>\n\n\n\n<p>E a\u00ed, j\u00e1 sabe por que usat TypeScript na sua aplica\u00e7\u00e3o? Espero que voc\u00ea tenha gostado do post! E se voc\u00ea est\u00e1 procurando um lugar onde ter\u00e1 oportunidade de trabalhar com as tecnologias mais recentes e ter liberdade de propor suas ideias, vem pra Take! Temos v\u00e1rias <strong>vagas abertas para a \u00e1rea de TI!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea \u00e9 um desenvolvedor front-end, certamente j\u00e1 ouviu falar da linguagem TypeScript. Mas afinal, o que de fato ela \u00e9? Por que usar TypeScript? E ainda, em que tipo de projeto devo utiliz\u00e1-la?Depois de uma boa caminhada utilizando o TypeScript como linguagem principal do meu dia-a-dia de trabalho, tentarei mostrar as principais vantagens de [&hellip;]<\/p>\n","protected":false},"author":511,"featured_media":5019,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-5002","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devs"],"lang":"pt","translations":{"pt":5002},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/posts\/5002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/users\/511"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/comments?post=5002"}],"version-history":[{"count":0,"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/posts\/5002\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/media\/5019"}],"wp:attachment":[{"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/media?parent=5002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/categories?post=5002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blip.ai\/blog\/wp-json\/wp\/v2\/tags?post=5002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}