<?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: Fernando Daciuk</title>
    <description>The latest articles on DEV Community by Fernando Daciuk (@fdaciuk).</description>
    <link>https://dev.to/fdaciuk</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%2F260621%2F3d11095a-e5aa-45d7-b81a-4df62f4e83f9.jpeg</url>
      <title>DEV Community: Fernando Daciuk</title>
      <link>https://dev.to/fdaciuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fdaciuk"/>
    <language>en</language>
    <item>
      <title>O que é o "is" no TypeScript?</title>
      <dc:creator>Fernando Daciuk</dc:creator>
      <pubDate>Tue, 08 Feb 2022 18:41:47 +0000</pubDate>
      <link>https://dev.to/fdaciuk/o-que-e-o-is-no-typescript-2g4m</link>
      <guid>https://dev.to/fdaciuk/o-que-e-o-is-no-typescript-2g4m</guid>
      <description>&lt;p&gt;O &lt;a href="https://twitter.com/juniormartinxo"&gt;Junior Martins&lt;/a&gt; postou essa dúvida no nosso &lt;a href="https://discord.gg/x99eevqaHd"&gt;Discord&lt;/a&gt;, e eu respondi ele por lá, mas o &lt;a href="https://www.linkedin.com/in/gabe-pinheiro/"&gt;Gabe&lt;/a&gt; sugeriu que a resposta virasse um post, então aqui está!&lt;/p&gt;




&lt;p&gt;O &lt;code&gt;is&lt;/code&gt; é usado quando você quer criar seus próprios &lt;em&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/2/narrowing.html#typeof-type-guards"&gt;type guards&lt;/a&gt;&lt;/em&gt;: você cria uma função que retorna um booleano (esse tipo de função se chama "predicado"), e usa o &lt;code&gt;is&lt;/code&gt; para dizer que, se a função retornar &lt;code&gt;true&lt;/code&gt;, quer dizer que o valor passado via argumento é de um tipo específico.&lt;/p&gt;

&lt;p&gt;Por exemplo: imagine que você vai fazer um request para uma API, para buscar um produto.&lt;/p&gt;

&lt;p&gt;A resposta pode ser um objeto com os &lt;strong&gt;dados do produto&lt;/strong&gt; ou &lt;strong&gt;&lt;code&gt;null&lt;/code&gt;&lt;/strong&gt;, se o produto não for encontrado.&lt;/p&gt;

&lt;p&gt;Poderíamos representar em tipos assim:&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;Product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&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;name&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;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;ProductResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos fazer uma função que vai fazer esse request (fake, obviamente).. ignore a implementação, a ideia é só retornar um objeto do tipo &lt;code&gt;ProductResponse&lt;/code&gt;, ou seja: ou vai retornar um &lt;code&gt;Product&lt;/code&gt;, ou vai retornar &lt;code&gt;null&lt;/code&gt;:&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;getProduct&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ProductResponse&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;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TV&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&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;possibleResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&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;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;possibleResponse&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;possibleResponse&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&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 executar essa função, o retorno vai ser uma &lt;code&gt;Promise&lt;/code&gt; de &lt;code&gt;ProductResponse&lt;/code&gt;. Se você tentar acessar o valor de &lt;code&gt;price&lt;/code&gt; da resposta - já que a função pode retornar um produto - o TS vai mostrar o erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Object is possibly 'null'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chamada seria algo assim:&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;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tv123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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;Para garantir que o objeto &lt;strong&gt;não é nulo&lt;/strong&gt;, precisamos usar um &lt;em&gt;type guard&lt;/em&gt;, verificando o tipo do dado para garantir que ele não é nulo antes de acessar as propriedades do objeto:&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;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tv123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// aqui o TS sabe que `response` é null&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// aqui o TS sabe que `response` é `Product`, pois `null`&lt;/span&gt;
    &lt;span class="c1"&gt;// e `Product` são as únicas possíveis opções para `response`&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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;Usar um &lt;code&gt;if&lt;/code&gt; com uma comparação por algum tipo (testando se o dado é igual a &lt;code&gt;null&lt;/code&gt;, ou usando o &lt;code&gt;typeof&lt;/code&gt;, por exemplo), é um &lt;em&gt;type guard&lt;/em&gt; interno do TypeScript. Mas pense o seguinte: e se você quiser criar seu próprio &lt;em&gt;type guard&lt;/em&gt;? Possivelmente você tentaria fazer algo assim:&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="nx"&gt;isProduct&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;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então testaria o valor:&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;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tv123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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 surpresa acontece quando descobrimos que o TS agora &lt;strong&gt;não consegue inferir&lt;/strong&gt; que &lt;code&gt;response&lt;/code&gt; só será &lt;code&gt;null&lt;/code&gt; se cair no &lt;code&gt;if&lt;/code&gt;, e dá o mesmo erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Object is possibly 'null'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É aí que entra o &lt;code&gt;is&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;Como a função &lt;code&gt;isProduct&lt;/code&gt; é apenas uma função que recebe &lt;strong&gt;um argumento qualquer&lt;/strong&gt;, e retorna &lt;strong&gt;um valor qualquer&lt;/strong&gt;, o TS não vai conseguir inferir que o retorno é um &lt;code&gt;Product&lt;/code&gt;, e que esse retorno está &lt;strong&gt;diretamente relacionado&lt;/strong&gt; com o &lt;strong&gt;argumento&lt;/strong&gt; passado para a função.&lt;/p&gt;

&lt;p&gt;Para fazer o TS entender essa relação, usamos o &lt;code&gt;is&lt;/code&gt;: temos que dizer ao TS que, quando executarmos a função &lt;code&gt;isProduct&lt;/code&gt; passando o argumento &lt;code&gt;response&lt;/code&gt;, se a função retornar &lt;code&gt;true&lt;/code&gt;, quer dizer que o argumento &lt;strong&gt;É&lt;/strong&gt;, de fato, um &lt;code&gt;Product&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para dizer isso ao TS, só precisamos alterar o tipo de retorno da função &lt;code&gt;isProduct&lt;/code&gt;:&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="nx"&gt;isProduct&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;ProductResponse&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto! Agora o TS vai saber quando o response é &lt;code&gt;null&lt;/code&gt; e quando ele é um &lt;code&gt;Product&lt;/code&gt; em um escopo &lt;strong&gt;completamente diferente&lt;/strong&gt; da função &lt;code&gt;isProduct&lt;/code&gt;!&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;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tv123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// agora o TS sabe - novamente - que `response` é null, pois estamos&lt;/span&gt;
        &lt;span class="c1"&gt;// verificando se `response` NÃO é um `Product`&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// e aqui o TS sabe que `response` é `Product`, pois `null`&lt;/span&gt;
    &lt;span class="c1"&gt;// e `Product` são as únicas possíveis opções para `response`&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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;Podemos também criar um &lt;em&gt;type guard&lt;/em&gt; mais genérico, para testar se o valor é &lt;em&gt;null&lt;/em&gt;, fazendo uma verificação positiva,  ao invés de criar um &lt;code&gt;if&lt;/code&gt; negativo, que dificulta um pouco a leitura:&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="nx"&gt;isNull&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;unknown&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então só precisamos usar essa função de &lt;em&gt;type guard&lt;/em&gt;:&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;getProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tv123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// aqui dentro o TS sabe que `response` é null&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// e aqui o TS sabe que `response` é `Product`, pois `null`&lt;/span&gt;
    &lt;span class="c1"&gt;// e `Product` são as únicas possíveis opções para `response`&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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;E tudo funciona como esperado, inclusive o autocomplete das propriedades &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;id&lt;/code&gt; em &lt;code&gt;response&lt;/code&gt; ;)&lt;/p&gt;

&lt;p&gt;Você pode brincar com esse código direto do &lt;a href="https://www.typescriptlang.org/play?#code/C4TwDgpgBACgTgewCYFcDGwoF4oG8BQURUAlkgFxQDOwcJAdgOaHH0CGAthJTXUy0TB003KPRQcARhDj4AvvnyhIsRKgwAlCFTAJ6VaDnjJ0mAD5iUAGyuK2VEPTRQAZiifASeqIwjBj6pgAFGQ8tAyMAJSUxhwkBgA8AaZaOnoGAHx4AlBo6ZhCJhjY2cRlpEgANDll7FyUAOQAKgBqDdXlxEIkIpQArAAMQzkKOXn6BQhUVCSSVhCpuvqGUADahYGVljYAumP5pPRIEAAeJQCybMAAFgB0LlYICHBBlze3cGxHCBxBkVAAKigumms3mi3SEFu8yYN0iOTgfhQcHowKmMzmC20SwMqwYxxOe1Gbg8XlR8WSxSCADc2FYUKJKcAIctolBafToPFVEVMAQyojgMjURyGVAAIRYHDiGzyRQkjBk0hUABy1isUBpdIZlHcAGt6AgAO70NmirlUbYa-nEQXC9nawxSq1y-C+fxqUxBBrAakARgATABmBqRW43CD0IKItLLbBZG1EEguTXxNU2aPYyGRf6J8oAenzUDYAEcUCQoMd6LQEFBa00AMrUNjSKBl6AAAxjOIgHagAEuXZ0iHaUSMcoWoNBS+W61BG83W+2oF2s8s+4OO0yO1tdNyOzKrB2J0XO9vqABj2v2KAAL-oPRvIKoAFvqRBuQgwABzgCv2mBNhPhXbtIWPMpxioBB5mhBBGEzWMDFuboRHhORIiAA"&gt;Playground do TypeScript!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por hoje é só! Qualquer dúvida ou sugestão, deixe nos comentários :D&lt;/p&gt;




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

&lt;p&gt;Você encontra minhas informações de contato e redes sociais rodando o seguinte comando no seu terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx fdaciuk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>ptbr</category>
    </item>
  </channel>
</rss>
