<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Filipe Roberto Beck</title>
    <description>The latest articles on Forem by Filipe Roberto Beck (@filipebeck).</description>
    <link>https://forem.com/filipebeck</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F117042%2F5f9636ad-33e3-41f6-aba8-41280ea2c6ec.jpg</url>
      <title>Forem: Filipe Roberto Beck</title>
      <link>https://forem.com/filipebeck</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/filipebeck"/>
    <language>en</language>
    <item>
      <title>Git push/pull de forma prática</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Tue, 23 Feb 2021 02:38:33 +0000</pubDate>
      <link>https://forem.com/filipebeck/git-push-pull-de-forma-pratica-3e7o</link>
      <guid>https://forem.com/filipebeck/git-push-pull-de-forma-pratica-3e7o</guid>
      <description>&lt;p&gt;Olá, Devs! Gostaria de compartilhar uma forma prática que encontrei para trabalhar com nomes de branches longos. Desde que a grande maioria das vezes o branch remoto a ser atualizado é o mesmo branch local, é possível substituir o nome do branch por &lt;code&gt;HEAD&lt;/code&gt;, como &lt;code&gt;git push origin HEAD&lt;/code&gt;, por exemplo. Mas eu queria algo que se resumisse à apenas um comando. Então, criei um alias para alvejar sempre o mesmo branch e evitar ter que escrever qualquer coisa a mais. Criei um alias nomeado &lt;code&gt;pushb&lt;/code&gt; para atualizar o mesmo branch remoto e outro de nome &lt;code&gt;pullb&lt;/code&gt; (não tão usado) para receber as atualizações.&lt;/p&gt;

&lt;p&gt;alias.pushb - &lt;code&gt;!git push origin $(git branch --show-current)&lt;/code&gt;&lt;br&gt;
alias.pullb - &lt;code&gt;!git pull origin $(git branch --show-current)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se, por exemplo, o nome do branch local é &lt;code&gt;feature/validate-payment-method-schema&lt;/code&gt;, ao invés de ter que digitar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git push origin feature/validate-payment-method-schema&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ou&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git push origin HEAD&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Basta digitar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git pushb&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bem mais simples, não? E o comando pode ser usado com qualquer outra opção do git, como &lt;code&gt;-f&lt;/code&gt;, por exemplo.&lt;/p&gt;

&lt;p&gt;Espero que essa dica possa ajudar outros tanto quanto está me ajudando :)&lt;/p&gt;

</description>
      <category>git</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>@willSet/@didSet (sem bugs dessa vez)</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Fri, 22 Jan 2021 00:37:26 +0000</pubDate>
      <link>https://forem.com/filipebeck/willset-didset-sem-bugs-dessa-vez-34d0</link>
      <guid>https://forem.com/filipebeck/willset-didset-sem-bugs-dessa-vez-34d0</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/filipebeck/typescript-willset-e-didset-com-decorators-1l7e"&gt;Nesse post&lt;/a&gt; eu mostrei um exemplo de implementação do &lt;a href="https://www.typescriptlang.org/docs/handbook/decorators.html"&gt;decorator&lt;/a&gt; &lt;code&gt;@willSet&lt;/code&gt; e &lt;code&gt;@didSet&lt;/code&gt;. Depois de editar o código 3 vezes devido à bugs, resolvi criar um novo post só postar a versão sem bugs. Estou usando em um projeto de integração da &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/API_Web_Audio"&gt;WebAudio API&lt;/a&gt; com &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt;. O arquivo é &lt;a href="https://github.com/FilipeBeck/react-audio-engine/blob/develop/src/toolkit/Decoration.ts?ts=2"&gt;esse&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Web Audio com React</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Tue, 18 Aug 2020 00:46:31 +0000</pubDate>
      <link>https://forem.com/filipebeck/web-audio-com-react-15a6</link>
      <guid>https://forem.com/filipebeck/web-audio-com-react-15a6</guid>
      <description>&lt;p&gt;Estou usando o &lt;a href="https://github.com/facebook/react/tree/master/packages/react-reconciler"&gt;react-reconciler&lt;/a&gt; para integrar a &lt;a href="https://www.w3.org/TR/webaudio/"&gt;API Web Áudio&lt;/a&gt; com &lt;a href="https://pt-br.reactjs.org/"&gt;React&lt;/a&gt;. Um preview de como está ficando a implementação de uma reprodução do exemplo &lt;a href="https://mdn.github.io/webaudio-examples/step-sequencer/"&gt;Step Sequencer&lt;/a&gt; da &lt;a href="https://developer.mozilla.org/pt-BR/"&gt;MDN&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--msQRjc-q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ALlzGpI.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--msQRjc-q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ALlzGpI.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tgFhGtxe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/073QcKF.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tgFhGtxe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/073QcKF.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZbzSyMMP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/SuW0EPf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZbzSyMMP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/SuW0EPf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu uso a extensão &lt;a href="https://chrome.google.com/webstore/detail/web-audio-inspector/cmhomipkklckpomafalojobppmmidlgl"&gt;Web Audio inspector&lt;/a&gt; do Chrome para visualizar o grapho de áudio&lt;/p&gt;

&lt;p&gt;Alguns vídeos que postei no Facebook:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/filipe.roberto.beck/videos/3131169306966562"&gt;Vídeo 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/filipe.roberto.beck/videos/3135788363171323"&gt;Vídeo 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/filipe.roberto.beck/videos/3137663279650498"&gt;Vídeo 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/filipe.roberto.beck/videos/3138293122920847"&gt;Vídeo 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/filipe.roberto.beck/videos/3144790862271073"&gt;Vídeo 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>webaudio</category>
      <category>reactreconciler</category>
    </item>
    <item>
      <title>PNPM Package Manager</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Sat, 11 Jul 2020 22:33:31 +0000</pubDate>
      <link>https://forem.com/filipebeck/pnpm-package-manager-3b0e</link>
      <guid>https://forem.com/filipebeck/pnpm-package-manager-3b0e</guid>
      <description>&lt;p&gt;Estava lendo as atualizações do VSCode e achei isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9dw1IAFt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1r9380kw0ufqqbj2ze0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9dw1IAFt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1r9380kw0ufqqbj2ze0k.png" alt="pnpn-vscode-news"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pnpm/pnpm"&gt;PNPM&lt;/a&gt; é um gerenciador de pacotes como o &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; e &lt;a href="https://yarnpkg.com"&gt;yarn&lt;/a&gt;, mas com a grande vantagem de usar um sistema de arquivos endereçável por conteúdo, compartilhando os arquivos entre projetos e entre diferentes versões do pacote.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6iSr83L2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w4tpdcsyc8j5dwcit3vv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6iSr83L2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w4tpdcsyc8j5dwcit3vv.png" alt="pnpm-github"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>npm</category>
      <category>yarn</category>
    </item>
    <item>
      <title>Typescript - `willSet` e `didSet` com decorators </title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Thu, 09 Jul 2020 20:46:14 +0000</pubDate>
      <link>https://forem.com/filipebeck/typescript-willset-e-didset-com-decorators-1l7e</link>
      <guid>https://forem.com/filipebeck/typescript-willset-e-didset-com-decorators-1l7e</guid>
      <description>&lt;p&gt;&lt;strong&gt;EDITADO(1):&lt;/strong&gt; Atualizei o exemplo para permitir o uso de &lt;code&gt;@willSet()&lt;/code&gt; e &lt;code&gt;@didSet()&lt;/code&gt; em sequência&lt;br&gt;
&lt;strong&gt;EDITADO(2):&lt;/strong&gt; Atualizei o exemplo para invocar &lt;code&gt;@willSet&lt;/code&gt; das superclasses depois e &lt;code&gt;@didSet&lt;/code&gt; das superclasses antes&lt;br&gt;
&lt;strong&gt;EDITADO(3):&lt;/strong&gt; Agora foi &lt;/p&gt;

&lt;p&gt;Achei no &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; uma lib bem interessante, chamada &lt;a href="https://github.com/1amageek/classy"&gt;classy&lt;/a&gt;, para observar mutações em propriedades de forma similar à linguagem &lt;a href="https://medium.com/the-andela-way/property-observers-didset-and-willset-in-swift-4-c3730f26b1e9"&gt;Swift&lt;/a&gt; usando &lt;a href="https://www.typescriptlang.org/docs/handbook/decorators.html"&gt;decorators&lt;/a&gt;. Ela é mais abrangente, fornecendo os decorators &lt;code&gt;@classy&lt;/code&gt; para a classe e &lt;code&gt;@property&lt;/code&gt; para as propriedades, com a possibilidade de definir &lt;code&gt;get&lt;/code&gt; e &lt;code&gt;set&lt;/code&gt; também. Eu queria algo mais simples, sem a necessidade de decorar a classe, sem &lt;code&gt;get&lt;/code&gt; e &lt;code&gt;set&lt;/code&gt; e usando diretamente os decorators &lt;code&gt;@willSet&lt;/code&gt; e &lt;code&gt;@didSet&lt;/code&gt;. O link com o código e exemplos está &lt;a href="https://www.staging-typescript.org/play?#code/PQKhCgAIUhlBbgtgIwPYBtUGdIGNWIAOAhgE4AuAlugBbEAm2kAppJfcwHZUBmluDJoWaZInAq3rFIhUqlmVmUjgDooIYOHycs5SAGtmAT1hGUGHAF4xzAO6QAssUIAeXaUqcA5gBpIWMzR0AD4ACgBKcHBQCGhIACVmXABXYVJpVH8kIMySdMhpXDoAN1ZmLGFcSj4BKUhUZLwPaWTEaXFi6SxWTgBjzOYAD0pdSlI1OIABPOJEA2NIADkJSDrZeQ8lBmYJjXAeZM5cKlROSC9mclNzdFDDIwAuf3IPb3CngJvIAG9wAEh0Jd5iZAhhINZ7tcglgVBdyHdjJF-tVIKEAISQ0HocI-f5-TE3GHdeH3PwEoLguBYhFGcKRP4AXyif1Il2SpDO5Iw4CZMXUCSSqWY+VyHkQzDGmTanEohGS6EEpBkpAAlwBaRDJKScADn0iGI3IXCNYmkAEPSMVUKzVqwAAbkMhwu27SDTMizSCO0hwyAABTk5AAz1RCJkusK2Eb0oxdpoDkcTmc4QAxMa6ADq1HQsEuoW9cKexE4RjJxihGA+WPekBTh2OlFOkAAPpBDhw+JwlLiAUDbNnc+QnnXE42zq328xO0pmYwe39++gc0DrAXLgBtLnoAC6AH4VIv0Hi13pV07LioAPqX9bkVDX-5Mhc0aisdGHweQABkX695-ISIsmyHKQB+lw8tEYD8okKRpBkyqUOKkqQNKsryoqMhBlgGpasWeosMMujGj05qWtakj2ieLr8u66RzCe-qBiGsrhv4kaUNGghxvs9ZJuclxpqQugACLsIO+b-kWJZliCNxVjcNYjg2TYTpwHaeN2vy9no9BiZcw68WOLZtmpU4afQs6ZFpfy6fQn5nj6F7aO4yTHNam7llie4qLZx7-pSJ5Xjegb3pej7-LYL6AqiaK2Z+P5-o5AHMqy5DsmccXgbyUFxMJSTWi0bTKhsijKBReAKlg3QFF2gzFnOrQocWaEKowSoAI7JKw3SkGaBGCo6c6YF44bcOUqzSOKWBFT1KGoLpNQMMQ3FDGGFCQAmylnGB8J0GpgKkE8oRdrYABqxDoF1Um0uCwSQFa7A1sWRg9ql6UbYZTYSUl11+OsaTkEYADSxgfC8ni+LaWC4B4hB3odjHyMKgN5dDsPw8Zk7TvQOLWSioQcGjsrw7jeJ-OQNByPYJ2QAAoqQcikBEeJMnizl6FulJwhWtz-cjwOImzpy6P4QqkFmS72fx5CCZmA55ieMk8-Sfzs16L5YBLy6nh9o6nPmGtPKgyAAFZJOQfgnedl3MNduOQHt9AHSoAhLgbIyW3Y1tdeEADcotpFrg77q7twUx7NhnRdPuQE+qvC3oJ6iXZK6JXCLsJ6Qrnwx5slBN5tkFDgSl8ap6ldhZflJRnOgvNn7lbtulLfKB2ZPOHmvyxbqzsO3-7J5+rN-H8ADypvmz5ZldgGSMUEY31wn9cgAwLpbzn8cIROvQFpSBHe5zz25kwyPhk8Sx1e9Hts1Td1nD2rGD0N7rCrhrB9ecyw-kxrQdORdYca09lHG2Kth770bpSK2V8ybk37npcgId-7uywH4R+z9QEnzJtoPgXh2TEGQICduWdmAs3pEybKsQYB5XwPkVo0h-qbDKraCqxAqqsGLEMeqmRGqoTlK1a0kBOrdWFH1IYA1BCQGGuGQgWECgoXKDNSMiB5rVH4EtFagw1p6E2nxTKu16oHSOmgq+dtbr3VQI9a6r1gJnB0UZBe+kb5L1noDEGjxnivEhoTGGxNrRPBnivVGPi4YCLLlPJQpNh7428eja0kSwGU1QNTOwdMGbWmZsPIe8da7Ah5lzS4PNQh8znm4lWassBiwHqnVM6ZyBVPhIrXJ1YhY5I7vUykdj9YdyNuPY4qD0BPxMTfe2FS0j1MQW7Du-TBkgP9o7Z2odkHTPQbHFpIsTy-x1oFdmWc3KkHfjcbyh4i61k+uOEy5cZxV3Tjs+u+yIHWBboePuSVNl+Fsu3DW7SsljzNscSe04An8wcd3YprjjB+DvpveJw83p7zfo3Y+p8v7nygTbUxd9ski2MTbAKCLPKHM-mA-8myJkAIjmin2MDwEEvzpAy+NtqVfPgS7JBUz6gDPQUirBpwcF4IIdfOuJDMlkJ5EAA"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse recurso é útil quando a propriedade não precisa ser computada mas tem efeitos colaterais. Isso evita a necessidade de criar um &lt;code&gt;setter&lt;/code&gt; para os efeitos colaterais e uma propriedade armazenada de nome similar que será atribuída pelo &lt;code&gt;setter&lt;/code&gt; antes de manipular os efeitos colaterais.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>decorators</category>
      <category>observer</category>
    </item>
    <item>
      <title>Gostaria de fazer um app?</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Tue, 05 May 2020 20:17:42 +0000</pubDate>
      <link>https://forem.com/filipebeck/gostaria-de-fazer-um-app-mfk</link>
      <guid>https://forem.com/filipebeck/gostaria-de-fazer-um-app-mfk</guid>
      <description>&lt;p&gt;Em 2010 eu estava aprendendo a programar para MacOS/iOS e decidi tentar implementar uma versão 360° do clássico "jogo da cobrinha", onde você controla uma serpente que vai aumentando de tamanho conforme você pega umas pelotas espalhadas pelo cenário, e precisa cuidar para não colidir com as paredes e com o próprio corpo.&lt;/p&gt;

&lt;p&gt;Link para um vídeo demonstrativo: &lt;a href="https://www.facebook.com/filipe.roberto.beck/videos/326847864065401"&gt;https://www.facebook.com/filipe.roberto.beck/videos/326847864065401&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na época, usei basicamente C e C++. Agora, quero refazer (e terminar) em Javascript. Se alguém quiser contribuir com as imagens, ficarei muito agradecido. A príncipio, as imagens necessárias serão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 Cabeça&lt;/li&gt;
&lt;li&gt;1 Escamas&lt;/li&gt;
&lt;li&gt;1 Fundo (disposto em mosaico)&lt;/li&gt;
&lt;li&gt;1 Bloco para parede (disposto em fila)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também seria legal algumas imagens para o logo e tela de recordes.&lt;/p&gt;

&lt;p&gt;Caso alguém queira contribuir, é só me enviar uma mensagem 🙂. Se não souber português, não tem problema. Podemos usar um &lt;code&gt;Dependency Inversion Pattern&lt;/code&gt; e nos comunicar através da interface &lt;code&gt;Google Translator&lt;/code&gt; 🤡&lt;/p&gt;

</description>
      <category>help</category>
      <category>contributorswanted</category>
      <category>design</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Versionamento semântico com NPM</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Sat, 18 Apr 2020 20:12:45 +0000</pubDate>
      <link>https://forem.com/filipebeck/versionamento-semantico-com-npm-id0</link>
      <guid>https://forem.com/filipebeck/versionamento-semantico-com-npm-id0</guid>
      <description>&lt;p&gt;Vou tentar explicar os conceitos sobre versionamento semântico que considero mais úteis para o usuário. Para informações detalhadas, acesse as fontes no final do artigo.&lt;/p&gt;

&lt;p&gt;Versionamento semântico é um padrão de versionamento de APIs que permite a separação entre mudanças que quebram a compatibilidade com versões anteriores (&lt;code&gt;major&lt;/code&gt;), mudanças que adicionam funcionalidades sem quebrar a retrocompatibilidade (&lt;code&gt;minor&lt;/code&gt;) e mudanças que não afetam a funcionalidade (&lt;code&gt;patch&lt;/code&gt;). Consiste basicamente de 3 números separados por ponto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patch
&lt;/h2&gt;

&lt;p&gt;É o 3° número. Qualquer atualização que não adicione, remova, ou modifique alguma funcionalidade deve incrementar esse dígito. Ex.: correções de bugs.&lt;br&gt;
Se você quiser manter a versão &lt;code&gt;major&lt;/code&gt; e &lt;code&gt;minor&lt;/code&gt; de sua dependência e atualizar apenas o &lt;code&gt;patch&lt;/code&gt;, inclua um &lt;code&gt;~&lt;/code&gt; antes da versão no arquivo &lt;code&gt;package.json&lt;/code&gt;. Ex.: ~3.4.1 - instala ou atualiza a versão 3.4 que contenha o &lt;code&gt;patch&lt;/code&gt; mais alto a partir de 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minor
&lt;/h2&gt;

&lt;p&gt;É o 2° número. Qualquer atualização que adicione funcionalidades sem quebrar o código que usa versões anteriores deve incrementar esse dígito. Ex.: adição de métodos em uma classe.&lt;br&gt;
Se você quiser manter a versão &lt;code&gt;major&lt;/code&gt; e atualizar a &lt;code&gt;minor&lt;/code&gt; e &lt;code&gt;patch&lt;/code&gt; de sua dependência, inclua um &lt;code&gt;^&lt;/code&gt; antes da versão no arquivo &lt;code&gt;package.json&lt;/code&gt;. Ex.: ^3.4.1 - instala ou atualiza a versão 3 que contenha o &lt;code&gt;minor&lt;/code&gt; e &lt;code&gt;patch&lt;/code&gt; mais alto a partir de 4.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Major
&lt;/h2&gt;

&lt;p&gt;É o 1° número. Qualquer atualização que quebre a retrocompatibilidade deve incrementar esse dígito. Ex.: Remoção de uma função ou a remoção/renomeação de um método de classe.&lt;br&gt;
Se você quiser manter a sua dependência sempre atualizada com a última versão, use um &lt;code&gt;*&lt;/code&gt; como versão no arquivo &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fontes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentação oficial: &lt;a href="https://semver.org"&gt;https://semver.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentação do NPM: &lt;a href="https://docs.npmjs.com/about-semantic-versioning"&gt;https://docs.npmjs.com/about-semantic-versioning&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ferramenta para testar a sintaxe:&lt;/strong&gt; &lt;a href="https://semver.npmjs.com/"&gt;https://semver.npmjs.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>javascript</category>
      <category>semversion</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Typescript - testando dados internos</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Wed, 25 Mar 2020 18:57:40 +0000</pubDate>
      <link>https://forem.com/filipebeck/typescript-testando-dados-internos-3oj7</link>
      <guid>https://forem.com/filipebeck/typescript-testando-dados-internos-3oj7</guid>
      <description>&lt;p&gt;No post anterior eu disse que abri uma &lt;a href="https://github.com/microsoft/TypeScript/issues/37513"&gt;issue&lt;/a&gt; no projeto da linguagem Typescript para permitir a exposição de dados internos e facilitar os testes unitários, mas o time da Microsoft acha que é um recurso fora de escopo por não estar de acordo com as semânticas definidas pelo Javascript. Então, criei um pacote no npm com essas atualizações e dei o nome de &lt;a href="https://www.npmjs.com/package/@filipe.beck/typescript-x"&gt;typescript-x&lt;/a&gt; (precisei criar um escopo porque o nome era muito similar a um já existente). Já estou usando ele para testar o pacote &lt;a href="https://www.npmjs.com/package/ts-infer"&gt;ts-infer&lt;/a&gt; e &lt;a href="https://github.com/FilipeBeck/ts-infer/commit/e7be3238fe5685899bcbe391341b64c5ef2af3ef"&gt;esse commit&lt;/a&gt; mostra como estou fazendo para usá-lo. Quero destacar dois pontos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Inferência pelo VSCode
&lt;/h3&gt;

&lt;p&gt;Após instalar o pacote, com &lt;code&gt;npm install @filipe.beck/typescript-x&lt;/code&gt;, é necessário adicioná-lo em &lt;code&gt;.vscode/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescript.tsdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node_modules/@filipe.beck/typescript-x/lib"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Depois disso, pressione &lt;code&gt;F1&lt;/code&gt; e selecione a versão adequada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xx7g3WYK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/YmTxM80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xx7g3WYK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/YmTxM80.png" alt="Selecionar versão da linguagem"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xu-j6UId--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/J5Md8U5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xu-j6UId--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/J5Md8U5.png" alt="Selecionar versão da linguagem"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuração do projeto
&lt;/h3&gt;

&lt;p&gt;Eu criei uma pasta &lt;code&gt;test&lt;/code&gt; com um arquivo &lt;code&gt;tsconfig.json&lt;/code&gt; extendendo a configuração original e adicionando a opção &lt;code&gt;testEnvironment&lt;/code&gt;. Essa opção vai exportar todos os membros de módulos e publicar todos os membros de classes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../tsconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"testEnvironment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./js-environment"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E é isso. Com essa configuração, posso acessar todos os dados internos dos módulos ao realizar os testes e manter os arquivos de release intactos.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>testing</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>Adeus, rewire</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Sun, 22 Mar 2020 00:38:31 +0000</pubDate>
      <link>https://forem.com/filipebeck/adeus-rewire-1145</link>
      <guid>https://forem.com/filipebeck/adeus-rewire-1145</guid>
      <description>&lt;p&gt;Acabei de criar uma &lt;a href="https://github.com/microsoft/TypeScript/issues/37513"&gt;issue&lt;/a&gt; no projeto da linguagem &lt;code&gt;Typescript&lt;/code&gt; sugerindo a adição de uma opção que permite expor todos os membros de módulos e classes. Já criei uma &lt;a href="https://github.com/FilipeBeck/TypeScript"&gt;implementação inicial&lt;/a&gt; que, até o momento, está funcionando como esperado (tanto a emissão dos arquivos quanto a inferência).&lt;/p&gt;

&lt;p&gt;Qualquer contribuição será muito bem vinda 😀&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>testing</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>Testando tipos genéricos com ts-infer</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Wed, 29 Jan 2020 01:34:13 +0000</pubDate>
      <link>https://forem.com/filipebeck/testando-tipos-genericos-com-ts-infer-499d</link>
      <guid>https://forem.com/filipebeck/testando-tipos-genericos-com-ts-infer-499d</guid>
      <description>&lt;p&gt;Entre as linguages de programação que conheço, &lt;a href="https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html"&gt;Typescript&lt;/a&gt; é a mais flexível em relção à &lt;a href="https://www.typescriptlang.org/docs/handbook/generics.html"&gt;genéricos&lt;/a&gt;. Um exemplo da "magia negra" que pode ser feita está no artigo &lt;a href="https://www.freecodecamp.org/news/typescript-curry-ramda-types-f747e99744ab/"&gt;How to master advanced TypeScript patterns&lt;/a&gt; de &lt;a href="https://github.com/pirix-gh"&gt;Pierre-Antoine Mills&lt;/a&gt;, criador do &lt;a href="https://github.com/pirix-gh/ts-toolbelt"&gt;ts-toolbel&lt;/a&gt;. A complexidade pode crescer ao ponto de se tornar trabalhoso testar se a definição genérica está bem formada. Se formos automatizar com testes unitários usando &lt;a href="https://github.com/kulshekhar/ts-jest"&gt;ts-jest&lt;/a&gt;, por exemplo, podemos detectar erros criando testes que instanciam os tipos conforme o esperado e o próprio compilador se encarregará de falhar caso a definição esteja mal formada. Porém, há dois problemas com essa abordagem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detecção da unidade de teste:&lt;/strong&gt; ocorre um erro de sintaxe na compilação do arquivo, e não no teste da unidade, além de encerrar a execução do script. O log de saída do teste mostra a linha onde o erro ocorreu, e não o teste onde ocorreu e o resultado esperado.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--drVJNLG3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/vW65QjU.png" alt="Erro ts-jest"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de cenários inválidos:&lt;/strong&gt; não é possível verificar se as restrições do tipo genérico estão bem definidas. Se você quiser confirmar se um valor inválido está realmente sendo tratado como erro, não há recursos para isso.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para tentar resolver esses dois problemas, criei uma lib, &lt;a href="https://www.npmjs.com/package/ts-infer"&gt;ts-infer&lt;/a&gt;, que é bem simples de usar. Ela funciona fazendo uso da &lt;a href="https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API"&gt;API do Typescript&lt;/a&gt; e do comentário &lt;a href="https://medium.com/xp-inc/dica-r%C3%A1pida-typescript-conhecendo-o-ts-ignore-1aea51f0b7cc"&gt;&lt;code&gt;// @ts-ignore&lt;/code&gt;&lt;/a&gt;. O comentário &lt;a href="https://medium.com/xp-inc/dica-r%C3%A1pida-typescript-conhecendo-o-ts-ignore-1aea51f0b7cc"&gt;&lt;code&gt;// @ts-ignore&lt;/code&gt;&lt;/a&gt; é usado para evitar erros na compilação pelo &lt;a href="https://github.com/kulshekhar/ts-jest"&gt;ts-jest&lt;/a&gt; dentro dos callbacks fornecidos para as funções do pacote. Dentro da função, as ocorrências desse comentário serão removidas e o callback será recompilado para que o erro possa ser inferido.&lt;/p&gt;

&lt;p&gt;Atualmente, há duas funções exportadas pelo pacote: &lt;code&gt;infer&lt;/code&gt; e &lt;code&gt;diagnose&lt;/code&gt;. Segue um exemplo de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// `TypeOfProps` infere a união entre os tipos&lt;/span&gt;
&lt;span class="c1"&gt;// das propriedades de uma classe ou interface.&lt;/span&gt;
&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;união de `Object.TypeOfProps` em conformidade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invalidInferences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// A função `infer()` lança uma exceção se encontrar erros de compilação.&lt;/span&gt;
    &lt;span class="nx"&gt;infer&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;TProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
        &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;// `TypeOfProps` de `&amp;lt;TProps&amp;gt;` deve ser `number | string | any[]`&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TypeOfProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="c1"&gt;// A linha abaixo será removida por `infer()`&lt;/span&gt;
      &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
      &lt;span class="nx"&gt;abc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invalidInferences&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toThrow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;// `PickPropsWithTypes` infere um subconjunto contendo apenas&lt;/span&gt;
&lt;span class="c1"&gt;// as propriedades que extendam um determinado tipo&lt;/span&gt;
&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;propriedades de `Object.PickPropsWithTypes` em conformidade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// A função `diagnose()` retorna um array com os diagnósticos dos erros encontrados&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invalidInferences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diagnose&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Inter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
      &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
      &lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// `PickPropsWithTypes` de `&amp;lt;Inter, string | number&amp;gt;`&lt;/span&gt;
    &lt;span class="c1"&gt;// deve ser `{ a: string, b: number, c: string }` &lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;pickedProps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PickPropsWithTypes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Inter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nx"&gt;pickedProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// A linha abaixo será removida por `diagnose()`&lt;/span&gt;
      &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
      &lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;pickedProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// A linha abaixo será removida por `diagnose()`&lt;/span&gt;
      &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
      &lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invalidInferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;infer()&lt;/code&gt; dentro do primeiro teste lança uma exceção se o callback fornecido apresentar erros de compilação. Já a função &lt;code&gt;diagnose()&lt;/code&gt; no segundo teste retorna uma array com os diagnósticos dos erros encontrados. Ambas removem os comentário &lt;a href="https://medium.com/xp-inc/dica-r%C3%A1pida-typescript-conhecendo-o-ts-ignore-1aea51f0b7cc"&gt;&lt;code&gt;// @ts-ignore&lt;/code&gt;&lt;/a&gt; e depois compilam o callback.&lt;/p&gt;

&lt;p&gt;Atuais problemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O escopo do callback fornecido se resume às declarações &lt;em&gt;locais&lt;/em&gt; desse callback e declarações de importação &lt;em&gt;top-level&lt;/em&gt; do arquivo de teste.&lt;/li&gt;
&lt;li&gt;É criado um arquivo temporário contendo o código do callback e das importações &lt;em&gt;top-level&lt;/em&gt; no mesmo diretório do arquivo de teste.&lt;/li&gt;
&lt;li&gt;Baixa performance. O processo de compilação é realizado para cada callback fornecido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretendo fixar esses 3 problemas em uma próxima versão compilando o arquivo de teste inteiro na primeira execução e depois extrair os erros de cada callback. Isso elimina a restrição do escopo, a necessidade de criar um arquivo temporário e o problema de performance.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>typescript</category>
    </item>
    <item>
      <title>VSCode - Extensão DEV Community</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Mon, 27 Jan 2020 05:37:20 +0000</pubDate>
      <link>https://forem.com/filipebeck/vscode-extensao-dev-community-1cl4</link>
      <guid>https://forem.com/filipebeck/vscode-extensao-dev-community-1cl4</guid>
      <description>&lt;p&gt;Estava criando um repositório &lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt; para organizar as minhas postagens e usar o &lt;a href="https://code.visualstudio.com/"&gt;vscode&lt;/a&gt; para editar os arquivos e depois copiar e colar no editor online, então resolvi pesquisar por alguma extensão relacionada e acabei encontrando uma bem interessante: &lt;a href="https://marketplace.visualstudio.com/items?itemName=sneezry.vscode-devto"&gt;DEV Community&lt;/a&gt;. Basta pesquisar  por &lt;strong&gt;dev.to&lt;/strong&gt; e será a primeira da lista (até a data deste post, pelo menos). Aparecerá um novo item na barra lateral de ações cujo conteúdo contém inicialmente as opções de logar, onde você deverá fornecer uma chave para autenticação com a API para manipulação das postagens, e uma outra opção para criar essa chave, onde você será redirecionado para as configurações da sua conta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fA1QU8uO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/WV2cN3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fA1QU8uO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/WV2cN3b.png" alt="Menu lateral de ações"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar a chave, clique na opção e siga as instruções no site que abrirá (é só digitar a descrição da chave e clicar em gerar). Para logar, clique na opção e cole a chave que você criou.&lt;/p&gt;

&lt;p&gt;Após logar você verá uma lista com as suas postagens. Clique em alguma para mostrar seu conteúdo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YX4spKRz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/t4mZcfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YX4spKRz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/t4mZcfc.png" alt="Lista com as postagens e editor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recursos disponíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edição&lt;/strong&gt;: Após editar, basta salvar da mesma forma que você faria com qualquer outro arquivo e sua postagem será salva remotamente. Para adicionar uma imagem, clique em &lt;code&gt;Upload images&lt;/code&gt; no canto inferior esquerdo do editor e escolha uma imagem para subir pro &lt;a href="https://imgur.com/"&gt;Imgur&lt;/a&gt;. Quando o upload terminar, uma marcação com a url da imagem será criada na posição do cursor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview&lt;/strong&gt;: Para um preview local, pressione &lt;code&gt;Ctrl + Shift + V&lt;/code&gt; para abri-lo em uma nova aba ou &lt;code&gt;Ctrl + K V&lt;/code&gt; para abrir lado a lado. A aparência será determinada pelas extensões de visualização de arquivos &lt;code&gt;.md&lt;/code&gt; que você tem instalado. Para um preview remoto, basta atualizar a página do seu post após salvar as edições que as mudanças já serão refletidas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publicação&lt;/strong&gt;: Para publicar, modifique o valor do campo &lt;code&gt;published&lt;/code&gt; para &lt;code&gt;true&lt;/code&gt; na &lt;em&gt;seção meta yaml&lt;/em&gt; no topo do post e salve, ou clique com o botão direito no título do post no menu lateral e selecione a opção de publicar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Criação de novo post&lt;/strong&gt;: Clique no botão &lt;code&gt;+&lt;/code&gt; no menu lateral. Um novo documento com uma &lt;em&gt;seção meta yaml&lt;/em&gt; default será criado. Salve e o post será criado remotamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remoção de post&lt;/strong&gt;: Clique com o botão direito no título do post no menu lateral e selecione a opção de deletar.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Assincronismo, concorrência e paralelismo</title>
      <dc:creator>Filipe Roberto Beck</dc:creator>
      <pubDate>Sun, 26 Jan 2020 02:53:34 +0000</pubDate>
      <link>https://forem.com/filipebeck/assincronismo-concorrencia-e-paralelismo-19hk</link>
      <guid>https://forem.com/filipebeck/assincronismo-concorrencia-e-paralelismo-19hk</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rBoP0aZa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ds6168je46jjo8d8q5ox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rBoP0aZa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ds6168je46jjo8d8q5ox.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de prosseguirmos, vamos esclarecer o que é uma &lt;strong&gt;thread&lt;/strong&gt;: Segundo o Wikipedia, thread é um "&lt;em&gt;fio de execução&lt;/em&gt;, também conhecida como &lt;em&gt;linha ou encadeamento de execução&lt;/em&gt;". É um fluxo de execução independente que roda de forma assíncrona em relação à outras threads, intercalando as execuções entre elas quando houver um único núcleo, ou executando cada uma em um núcleo separado quando houver mais de um (ou uma combinação dos dois - o que é mais frequente, pois o número de threads geralmente excede o número de núcleos). Em resumo, conceitualmente um grupo de threads em execução rodam de forma independente e ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Algo que pode gerar confusão é que assincronismo, concorrência e paralelismo não são necessariamente exclusivos. Uma atividade paralela também é concorrente, o que por sua vez também é assíncrona. Um é subgrupo do outro, conforme mostra a imagem acima. Vamos esclarecer um a um, do mais geral ao mais específico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assincronismo&lt;/strong&gt;: É qualquer atividade onde a ordem das operações não pode ser determinada. Pode ser duas threads em execução, mas também pode ser uma única thread consumindo eventos de uma fila como, por exemplo, uma aplicação de interface gráfica. Nesse caso, a ordem dos eventos depende do usuário e o programa age de forma diferente dependendo se o próximo evento é uma tecla digitada, um movimento do mouse ou uma ação de fechar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rkGrXmGC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/srbq0rqfoj5iqo1fqtph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rkGrXmGC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/srbq0rqfoj5iqo1fqtph.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concorrência&lt;/strong&gt;: Refere-se à várias threads em execução simultânea, podendo estarem rodando em núcleos distintos ou intercalando as execuções em um único núcleo. Dois processos executando em um sistema operacional são dois &lt;em&gt;fios de execução&lt;/em&gt; concorrendo por clocks da CPU.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Walh2zgT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6ie0r8os0w3em3x8zoiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Walh2zgT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6ie0r8os0w3em3x8zoiw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paralelismo&lt;/strong&gt;: Refere-se à várias threads executando em núcleos distintos. Dois processos executando em uma CPU dual-core, cada uma em um núcleo, são &lt;em&gt;dois fios de execução&lt;/em&gt; executando de forma paralela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dYQGC-G_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gs6y3jog4ntynsh52k5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dYQGC-G_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gs6y3jog4ntynsh52k5j.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
