<?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>DEV Community: Lara Carvalho</title>
    <description>The latest articles on DEV Community by Lara Carvalho (@laracarvalho).</description>
    <link>https://dev.to/laracarvalho</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%2F1032458%2F044e3fca-996a-4d72-bc4b-2cdb01e2eb5b.png</url>
      <title>DEV Community: Lara Carvalho</title>
      <link>https://dev.to/laracarvalho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/laracarvalho"/>
    <language>en</language>
    <item>
      <title>Como passar no AWS Certified Cloud Practitioner Exam</title>
      <dc:creator>Lara Carvalho</dc:creator>
      <pubDate>Wed, 14 Jun 2023 21:28:32 +0000</pubDate>
      <link>https://dev.to/laracarvalho/como-passar-no-aws-certified-cloud-practitioner-exam-2870</link>
      <guid>https://dev.to/laracarvalho/como-passar-no-aws-certified-cloud-practitioner-exam-2870</guid>
      <description>&lt;p&gt;Existem alguns benefícios em tirar uma certificação da AWS. Dentre se desenvolver credibilidade sobre seus conhecimentos, dar mais confiança a usuários recorrentes, você consegue demonstrar suas qualificações de nuvem de forma comprovada.&lt;/p&gt;

&lt;p&gt;Tive o prazer de participar de uma ação da &lt;a href="https://www.linuxtips.io/"&gt;LinuxTips&lt;/a&gt; #CHamaAsMina para disseminar o conhecimento sobre AWS, onde eles disponibilizaram seu curso preparatório para o Certified Cloud Practitioner com um voucher 100% para o exame. Aproveitando essa oportunidade, comecei a estudar para tirar minha certificação. Já tinha interesse em realizar o AWS Certified Solutions Architect e pensei em usar essa experiência como aprendizado para a próxima vez.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre o Exame
&lt;/h2&gt;

&lt;p&gt;Segundo a &lt;a href=""&gt;página da certificação&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;"O AWS Certified Cloud Practitioner oferece uma compreensão básica dos conceitos, serviços e terminologia da Nuvem AWS. Esse é um bom ponto de partida para indivíduos em funções não técnicas, sem experiência prévia com TI ou em nuvem, ou para aqueles com experiência em TI on-premises que buscam fluência básica na Nuvem AWS. Essa certificação pode dar aos candidatos a confiança necessária para enfrentar as certificações da AWS com base em função."&lt;/p&gt;

&lt;p&gt;Essa é a certificação fundamental de nível básico, ela é recomendada para profissionais que tem ou não experiência na nuvem AWS e prevê preparar o candidato para conhecer mais os principais serviços e casos de uso da AWS, modelos de cobrança, conceitos de segurança e precificação de tais serviços. Apesar disso, o guia do exame recomenda que o candidato tenha 6 meses de experiência com a nuvem AWS.&lt;/p&gt;

&lt;p&gt;Alguns dados gerais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A prova dura 90 minutos&lt;/li&gt;
&lt;li&gt;Para passar, você precisa acertar 70% da prova (isso dá 56 questões)&lt;/li&gt;
&lt;li&gt;Conta com 65 perguntas de múltipla escolha (algumas podendo escolher várias respostas)&lt;/li&gt;
&lt;li&gt;Custo de $100 dólares&lt;/li&gt;
&lt;li&gt;Você pode optar por fazer a prova online ou em um centro autorizado de treinamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para entender mais do exame, a Amazon disponibiliza um guia do &lt;a href="https://d1.awsstatic.com/pt_BR/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf"&gt;exame com explicações&lt;/a&gt; sobre conceitos abordados. Além disso, conta também com um &lt;a href="https://d1.awsstatic.com/pt_BR/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Sample-Questions.pdf"&gt;exemplo de perguntas&lt;/a&gt; (disponível em português!) para entender melhor como funciona a prova em si.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparação
&lt;/h2&gt;

&lt;p&gt;Eu utilizo AWS há alguns anos, porém não foi um uso contínuo. Já trabalhei em empresas que usavam muitos serviços serverless, então o contato como dev era maior, e outra cujo contato era mais concentrado no time de DevOps, então não me considero expert na plataforma. Como ganhei um curso preparatório, resolvi começar por lá. Todos os dias estudava um assunto diferente e ia seguindo por lá.&lt;/p&gt;

&lt;p&gt;Muitos serviços eu já utilizei no dia-a-dia, mas outros conhecia apenas por nome, porque não houve necessidade real em brincar com ele. Agora, a própria AWS conta com um curso preparatório oficial que pode ser &lt;a href="https://explore.skillbuilder.aws/learn/course/external/view/elearning/13523/exam-prep-aws-certified-cloud-practitioner-with-practice-material-portuguese"&gt;acessado aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Caso você consiga acompanhar em inglês, o freeCodeCamp liberou &lt;a href="https://www.youtube.com/watch?v=SOTamWNgDKc&amp;amp;pp=ygUfZnJlZWNvZGVjYW1wIGNsb3VkIHByYWN0aXRpb25lcg%3D%3D"&gt;este video de 13h&lt;/a&gt; para estudar para o exame. Foi ele que usei logo depois do da LinuxTips para me preparar. Nos comentários existem alguns timestamps com a organização de cada tópico, então foi fácil navegar pelo video quando eu tinha dúvida em algum conceito. &lt;/p&gt;

&lt;p&gt;Por último, achei melhor treinar com o que eu conseguia de provas então achei no Udemy &lt;a href="https://www.udemy.com/course/aws-certified-cloud-practitioner-practice-test"&gt;este curso&lt;/a&gt; com 6 simulados de perguntas reais da prova onde eu poderia treinar quantas vezes eu quisesse. Ele sempre entra em promoção, então é possível consegui-lo por um preço acessível. Não ganho nada por recomendá-los, e vou trazer uma alternativa grátis, mas se você quer ter a experiência de prova, esses simulados são bem úteis.&lt;/p&gt;

&lt;p&gt;Todas às vezes que eu fazia um simulado, eu lia todas as respostas (as que acertei e errei) porque eles trazem explicações do porquê de cada resposta estar errada/certa. Isso me fez entender melhor meus pontos fracos e buscar os dados corretos. Fui anotando tudo que eu achava confuso; nomes parecidos foram meu maior problema. Às vezes eu conhecia o serviço, mas os nomes me confundiam e acabava errando uma questão. Para quem tem dificuldade em gravar as coisas, repetir os simulados pode ajudar e muito!&lt;/p&gt;

&lt;p&gt;Eu estudei por 1 mês de forma interrupta, então não foi todo dia que eu pegava e via um conteúdo novo. Às vezes só consegui estudar um dia na semana porque eu estou também estudando para uma especialização, então eu fazia o que podia.&lt;/p&gt;

&lt;p&gt;No fim, fiz os 6 simulados 5 vezes. Aqui está a média das minhas notas cada vez que fiz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primeira vez: 66% (não havia terminado o curso);&lt;/li&gt;
&lt;li&gt;Segunda vez: 75% (não havia terminado o curso);&lt;/li&gt;
&lt;li&gt;Terceira vez: 79% (curso finalizado);&lt;/li&gt;
&lt;li&gt;Quarta vez: 88% (curso finalizado);&lt;/li&gt;
&lt;li&gt;Quinta vez: 94% (curso finalizado).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apesar de não ser uma média super alta, meu objetivo era conseguir pelo menos 90% nos testes sabendo que teria uma margem para a prova. É claro, poderia buscar outros recursos, mas preferi jogar a favor dos meus pontos fortes.&lt;/p&gt;

&lt;p&gt;Um último recurso que se tornou indispensável foi esse &lt;a href="https://github.com/Ditectrev/AWS-Cloud-Practitioner-CLF-C01-Exam-Questions-Answers"&gt;repositório&lt;/a&gt; com quase 600 questões do banco de perguntas da AWS. Analisar as perguntas e respostas aqui fez com que eu entendesse um pouco de perguntas que não estavam no grupo do curso do Udemy. Se você não quiser pagar pelo curso, consegue usar essa lista para simular um ambiente de prova, lembrando que são 65 questões em 90 minutos. É só separar algumas questões, colocar um timer e treinar!&lt;/p&gt;

&lt;h2&gt;
  
  
  Como é a prova de verdade?
&lt;/h2&gt;

&lt;p&gt;Eu escolhi fazer a prova num local aprovado pela AWS e a Pearson por achar algumas das regras de prova online um pouco difíceis de garantir (falta de barulho, conexão constante, preparar a máquina, etc.).&lt;/p&gt;

&lt;p&gt;Achei que seria mais complicado, eles são bem rígidos em exigir que você chegue com 15 minutos de antecedência, mas comigo acabei chegando cedo demais e o pessoal do local me permitiu até adiantar meu horário. Você entrará em uma sala com computadores preparados apenas para a prova, irá conectar com as suas credenciais e iniciar a prova. Tem um timer rolando e você pode revisar as perguntas antes de enviá-las para aprovação. Dependendo da sua prova, você recebe uma mensagem no fim dizendo se passou ou não, mas o resultado completo com o certificado só vem em até 5 dias úteis.&lt;/p&gt;

&lt;p&gt;Eu achei a prova bem condizente com o material que estudei. Alguns tópicos eu não havia estudado, então provavelmente não fui bem neles, mas as perguntas das matérias e serviços que estudei estavam bem fáceis, então foi bem tranquilo para mim. No fim, minha nota final foi 855 (de 1000), então estou feliz com o resultado. Se você se importa em gabaritar, talvez um tempo extra de treino seja necessário.&lt;/p&gt;

&lt;p&gt;Agora, sobre compreender mesmo os assuntos, todo esse esforço valeu a pena? Eu sinto que aprendi, sim, detalhes de vários serviços que havia usado antes, mas que não tinha me aprofundado. Aprendi mais sobre serviços que nunca havia trabalhado e entendi mais a filosofia de arquitetura da AWS.&lt;/p&gt;

&lt;p&gt;Achei que a experiência valeu, sim, a pena, e depois que você obtém a certificação, você ganha algumas coisas como: 50% de desconto na próxima prova, acesso a uma comunidade de pessoas certificadas, o badge para mostrar sua certificação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que tenham curtido o que eu trouxe hoje. O post original pode ser encontrado aqui: &lt;a href="https://laracarvalho.net/post/como-passar-aws-certified-cloud-practitioner/"&gt;https://laracarvalho.net/post/como-passar-aws-certified-cloud-practitioner/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>webdev</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Como usar error cause no Javascript e no Typescript</title>
      <dc:creator>Lara Carvalho</dc:creator>
      <pubDate>Wed, 08 Mar 2023 14:11:09 +0000</pubDate>
      <link>https://dev.to/laracarvalho/como-usar-error-cause-no-javascript-e-no-typescript-4kmp</link>
      <guid>https://dev.to/laracarvalho/como-usar-error-cause-no-javascript-e-no-typescript-4kmp</guid>
      <description>&lt;p&gt;Tratar erros nunca é uma tarefa divertida, principalmente no ecossistema Javascript onde precisamos tratar vários tipos de erros; HTTP, Node, milhares de bibliotecas...&lt;/p&gt;

&lt;p&gt;Uma proposta relativamente recente me chamou bastante à atenção em relação ao tratamento de erros. Se trata da &lt;a href="https://github.com/tc39/proposal-error-cause"&gt;proposal-error-cause&lt;/a&gt;, já disponível nas versões mais atualizadas dos navegadores e do Node 16.9.0. De forma resumida, ela traz a razão, a causalidade de um erro específico.&lt;/p&gt;

&lt;p&gt;Sabe quando precisamos fazer um fetch em uma API e precisamos tratar diversos erros como a própria falha da rota, bug em nossa implementação ou até mesmo um erro terceiro, que não previmos ainda? É uma loucura tratar isso tudo da forma tradicional, mas usando um exemplo descrito na própria proposta, podemos ver como esse tal error.cause pode nos ajudar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;doJob&lt;/span&gt;&lt;span class="p"&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;rawResource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;//domain/resource-a&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Download raw resource failed&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="na"&gt;cause&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="p"&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;jobResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doComputationalHeavyJob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawResource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;//domain/upload&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;jobResult&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Upload job result failed&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="na"&gt;cause&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&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="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;doJob&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Caused by&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cause&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Error: Upload job result failed&lt;/span&gt;
&lt;span class="c1"&gt;// Caused by TypeError: Failed to fetch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além dos nossos logs tratados, recebemos exatamente a causa daquele erro estar sendo levantado. Isso resolve aquele problema de tentar encapsular erros em mensagens bonitinhas e acabar tirando um pouco da transparência que facilita um bom &lt;em&gt;debugging&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora, tudo parece muito fácil, certo? Só começar a aplicar isso ao seu código e ser feliz. Na verdade, ainda não temos uma implementação dessa propriedade no Typescript até o momento (02/2023).&lt;/p&gt;

&lt;p&gt;Se você tentar acessar a propriedade, receberá um erro dizendo que tal propriedade não existe na classe Error.&lt;/p&gt;

&lt;p&gt;Isso porque o Typescript trabalha em cima de versões novas do ES e Node. Como essa proposta foi aprovada e adicionada à versão 16.9.0 do Node, e o time do Typescript adicionou essa mudança algum tempo depois, precisamos atualizar nosso tsconfig.&lt;/p&gt;

&lt;p&gt;Veja o exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-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;"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;"lib"&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;"es2022"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&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;Atualizando o compilerOptions.lib para ES2022, os erros em relação ao error.cause irão desaparecer e você irá poder usurfruir dessa ferramenta poderosíssima.&lt;/p&gt;

&lt;p&gt;Para referência, a compatibilidade da proposta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Chrome, released on 93,&lt;/li&gt;
&lt;li&gt;  Firefox, released on 91,&lt;/li&gt;
&lt;li&gt;  Safari, released on 15,&lt;/li&gt;
&lt;li&gt;  Node.js, released on &lt;a href="https://nodejs.org/en/blog/release/v16.9.0/#error-cause"&gt;v16.9.0&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
    </item>
    <item>
      <title>Entendendo TypeGuards, keyof e Template Literals em Typescript Avançado</title>
      <dc:creator>Lara Carvalho</dc:creator>
      <pubDate>Thu, 23 Feb 2023 14:00:00 +0000</pubDate>
      <link>https://dev.to/laracarvalho/3-coisas-que-voce-deve-saber-sobre-typescript-10oe</link>
      <guid>https://dev.to/laracarvalho/3-coisas-que-voce-deve-saber-sobre-typescript-10oe</guid>
      <description>&lt;p&gt;Existem 3 features que você deve entender para parar de tratar o Typescript como uma barreira e começar a vê-lo como uma ferramenta. Porque ele é poderosíssimo, e vai muito além de tipar tudo como &lt;code&gt;any&lt;/code&gt; pra fazer o console parar de te perturbar.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Type Guards
&lt;/h2&gt;

&lt;p&gt;De acordo com a documentação oficial:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um type guard é uma expressão que performa uma checagem que garante que o tipo está de acordo com o escopo definido.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;“A type guard is some expression that performs a runtime check that guarantees the type in some scope.” —&lt;/em&gt; &lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html" rel="noopener noreferrer"&gt;&lt;em&gt;typescriptlang.org&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O que exatamente isso significa? Com essa ferramenta, podemos afunilar as possíveis tipagens que queremos receber de nossos objetos. Criamos uma forma muito simples de assegurar uma segurança de tipos em nosso código, nada de receber algo que não estávamos esperando.&lt;/p&gt;

&lt;p&gt;Então como podemos criar nossas próprias type guards?&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo usando a ferramenta typeof, já nativa do Javascript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Human&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;breathe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Robot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createEntity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Human&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;breathe&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&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="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;breathe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calculate&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&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="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &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;Ao escrever este código acima, imediatamente recebemos os erros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Property 'breathe' does not exist on type 'Human | Robot'. Property 'breathe' does not exist on type 'Robot'.(2339)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Property 'calculate' does not exist on type 'Human | Robot'. Property 'calculate' does not exist on type 'Human'.(2339)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então antes mesmo de rodar nosso código, recebemos um erro importante: Alguns dos métodos descritos não podem existir em cada tipo que a minha função recebe. Isso porque meu argumento recebe um tipo de união entre Human e Robot. Então a minha implementação não satisfaz a definição da minha função.&lt;/p&gt;

&lt;p&gt;Vamos criar então nossos type guards para resolver esse problema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isHuman&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Human&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;Human&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;breathe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isRobot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Human&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;Robot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calculate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essas funções básicas, eu consigo checar se a propriedade especificada pertence ao objeto.&lt;/p&gt;

&lt;p&gt;E como type guards tem seu próprio escopo, o que acontece dentro de cada bloco de função terá seu check executado sem interferir no que acontece fora dela. O tipo de entity permanece unknown.&lt;/p&gt;

&lt;p&gt;E agora posso reescrever aquela função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createEntity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Human&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isHuman&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;breathe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isRobot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &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;h2&gt;
  
  
  2. Keyof
&lt;/h2&gt;

&lt;p&gt;Utilizando essa keyword nós podemos criar dinanismo à nossas funções de uma maneira muito interessante.&lt;/p&gt;

&lt;p&gt;Vamos ver este exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;MenuOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ChosenOption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;MenuOptions&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;choose&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;ChosenOption&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MenuOptions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Logger: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is set to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui temos uma interface que define algumas opções de menu e um tipo que define que opção nós escolhemos a partir da key (chave) da interface, no caso são start, pause, stop.&lt;/p&gt;

&lt;p&gt;E abaixo temos uma função de logs chamada choose que recebe um tipo T genérico, que extende o ChosenOption e um valor que deve se adequar aos valores das keys de MenuOptions. Nesse caso, só temos booleans.&lt;/p&gt;

&lt;p&gt;Então fazendo alguns testes, veremos que:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;choose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;'&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="c1"&gt;// Logger: start is set to true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;choose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pause&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// Logger: pause is set to false&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;choose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// Erro: Argument of type 'number' is not assignable to parameter of type 'boolean'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora temos uma função que satisfaz a nossa segurança de tipagem e que é extensível a partir da nossa interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Template Literal Types
&lt;/h2&gt;

&lt;p&gt;Às vezes nós não precisamos de tipos ultra complexos nem criar um monte de definição específica, às vezes nós precisamos de algumas definições em string para mapear IDs, ações externas ao nosso código, tags que devem ser expostas em texto, etc.&lt;/p&gt;

&lt;p&gt;Para isso, podemos usar os template literal types, que são baseados em string literals para expandir nossa forma de trabalhar com strings através de union types.&lt;/p&gt;

&lt;p&gt;Vamos ver alguns exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greetings&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;welcome_text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;goodbyes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pt_br&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en_us&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LocaleGreetings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Languages&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="nx"&gt;Greetings&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, de forma simples, temos vários novos tipos preparados a serem usados. Alguns exemplos: pt_br_greetings, en_goodbyes, etc.&lt;/p&gt;

&lt;p&gt;Outro exemplo é quando queremos receber uma informação já bem descritiva. Imagine que preciso receber um evento que modifica dados no meu banco, mas em três diferentes instâncias: quando inserimos um dado, quando atualizamos um dado ou quando deletamos um dado.&lt;/p&gt;

&lt;p&gt;Nosso código usando template literals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;EventMethods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INSERT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DELETE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EventMethods&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em vez de aceitar apenas strings genéricas e checar dentro do meu código se elas são válidas ou não, eu defino exatamente o que quero receber e deixo o runtime check fazer o trabalho por mim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que tenham curtido o que eu trouxe hoje. Caso queiram ver esse conteúdo em vídeo: &lt;a href="https://www.youtube.com/watch?v=_PT-TBcb5Nw" rel="noopener noreferrer"&gt;Video no Youtube&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>introduction</category>
      <category>pcgaming</category>
      <category>gaminghardware</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
