<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Typescript on Techformist</title>
    <link>https://techformist.com/tags/typescript/</link>
    <description>Recent content in Typescript on Techformist</description>
    <image>
      <url>https://techformist.com/logo.svg</url>
      <link>https://techformist.com/logo.svg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 14 Oct 2019 06:30:00 +0000</lastBuildDate><atom:link href="https://techformist.com/tags/typescript/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>unknown vs. any in Typescript</title>
      <link>https://techformist.com/unknown-vs-any-typescript/</link>
      <pubDate>Mon, 14 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/unknown-vs-any-typescript/</guid>
      <description>&lt;p&gt;Why use &lt;code&gt;unknown&lt;/code&gt; when we have &lt;code&gt;any&lt;/code&gt; in Typescript?&lt;/p&gt;
&lt;p&gt;Type inferences are powerful and allows us to do magic when we don&amp;rsquo;t know types.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;any&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;unknown&lt;/code&gt; seems to do the same thing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;unknown&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, which to use where?&lt;/p&gt;
&lt;p&gt;Let us extend the previous examples to put that question to rest. Consider what happens when you try to do any operation on the type.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;any&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;unknown&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// error TS2365: Operator &amp;#39;+&amp;#39; cannot be applied to types &amp;#39;unknown&amp;#39; and &amp;#39;1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;unknown&lt;/code&gt; applies itself enthusiastically to equality operations, asserts and checks, but not for any other operations.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Why use <code>unknown</code> when we have <code>any</code> in Typescript?</p>
<p>Type inferences are powerful and allows us to do magic when we don&rsquo;t know types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">i</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p><code>unknown</code> seems to do the same thing.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">unknown</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span></span></code></pre></div><p>So, which to use where?</p>
<p>Let us extend the previous examples to put that question to rest. Consider what happens when you try to do any operation on the type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">i</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//2
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">unknown</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2365: Operator &#39;+&#39; cannot be applied to types &#39;unknown&#39; and &#39;1&#39;
</span></span></span></code></pre></div><p><code>unknown</code> applies itself enthusiastically to equality operations, asserts and checks, but not for any other operations.</p>
<p>This makes sense because we do not know the type of the particular variable and cannot subject it to operations or methods that expect a specific type.</p>
<p>Using <code>unknown</code> lends itself to better type safety and is recommended to be used for unknown data types.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Interfaces as function types in Typescript</title>
      <link>https://techformist.com/interfaces-function-types-typescript/</link>
      <pubDate>Sun, 13 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/interfaces-function-types-typescript/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s get to know interfaces for functions - yes, that&amp;rsquo;s a thing.&lt;/p&gt;
&lt;p&gt;We have seen &lt;a href=&#34;https://techformist.com/class-object-interface-typescript/&#34;&gt;interfaces used as types&lt;/a&gt; and &lt;a href=&#34;https://techformist.com/interfaces-arrays-typescript/&#34;&gt;interfaces as array types&lt;/a&gt;. Since function is an object and interfaces are supported on other objects, they should be supported on functions also. Right?&lt;/p&gt;
&lt;p&gt;You betcha.&lt;/p&gt;
&lt;p&gt;What is this blog if we can&amp;rsquo;t write about all the stuff that no one care&amp;rsquo;s about? Well, to be clear - I am not starting that trend today.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let&rsquo;s get to know interfaces for functions - yes, that&rsquo;s a thing.</p>
<p>We have seen <a href="/class-object-interface-typescript/">interfaces used as types</a> and <a href="/interfaces-arrays-typescript/">interfaces as array types</a>. Since function is an object and interfaces are supported on other objects, they should be supported on functions also. Right?</p>
<p>You betcha.</p>
<p>What is this blog if we can&rsquo;t write about all the stuff that no one care&rsquo;s about? Well, to be clear - I am not starting that trend today.</p>
<p>Let&rsquo;s see an example of a simple function -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>Imagine we have to support similar functions for all other million mathematical expressions. What are we going to do? Write a million types - never! We are no beasts.</p>
<p>We do something graceful using them interfaces and apply them to the function arguments.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">twoNumOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">z</span><span class="o">:</span> <span class="nx">twoNumOp</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">z</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">z</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">2</span> <span class="p">}));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>Quite neat - won&rsquo;t you say? But, it can be much neater.</p>
<p>We will wrap the entire darn function with an interface so that it covers all the things required to support the million math operations.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">twoNumOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="k">void</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">summerOfAll</span><span class="o">:</span> <span class="nx">twoNumOp</span> <span class="o">=</span> <span class="nx">getSum</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">summerOfAll</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>The added advantage - you don&rsquo;t go about changing function signatures for object oriented programming. That is so 2000s. Now, you just mask (interface) the non-OOP beauty.</p>
<p>Let&rsquo;s say you have another function with a similar signature,</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getProd</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">*</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>.. all you have to do is to apply signature..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">prodOfTwo</span><span class="o">:</span> <span class="nx">twoNumOp</span> <span class="o">=</span> <span class="nx">getProd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">prodOfTwo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2
</span></span></span></code></pre></div><p>And, you are off to races (or wherever you go after you code a million math op&rsquo;s).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Modules in Typescript</title>
      <link>https://techformist.com/modules-typescript/</link>
      <pubDate>Sat, 12 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/modules-typescript/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s not the why, but more on what of &amp;lsquo;modules&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;No Javascript is an island. It was an island about two decades back but Javascript has done some pretty good land reclaimation to form large continents now.&lt;/p&gt;
&lt;p&gt;So it goes without saying that these are not the days of writing Javascript or Typescript in &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag in a single HTML. A typical project has hundreds of packages and a lot of code written by you and others who hate you.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s not the why, but more on what of &lsquo;modules&rsquo;.</p>
<p>No Javascript is an island. It was an island about two decades back but Javascript has done some pretty good land reclaimation to form large continents now.</p>
<p>So it goes without saying that these are not the days of writing Javascript or Typescript in <code>&lt;script&gt;</code> tag in a single HTML. A typical project has hundreds of packages and a lot of code written by you and others who hate you.</p>
<p>While it can be easy enough to split code in separate files to try maintaining them - they can get confusing and a bit dangerous since everyone has access to global scope.</p>
<p>Ergo, modules.</p>
<p>Modules provide a convenient way to split code and keep everything incl. scope tidy. Let&rsquo;s see some examples on how we can create and use modules.</p>
<h3 id="export-a-function--variable">Export a function / variable</h3>
<p>A module is typically written in its own file, and thereon affectionately called as &ldquo;external module&rdquo;.</p>
<p>An external module has what is called &ldquo;top level export&rdquo;. The <code>export</code> statement is at the file level and is not under a class or function.</p>
<p>An &ldquo;internal module&rdquo; is no more called that, but is called &ldquo;namespaces&rdquo;. We will deal with it at a later time.</p>
<p>Consider a simple example of an external module -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// math-op.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="kr">double</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSumDouble</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">)</span> <span class="o">**</span> <span class="kr">double</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">getSumDoub</span><span class="o">:</span> <span class="nx">getSumDouble</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>The code block is introduced in a separate file - it brings not only code clarity and readability due to lesser code, but also narrower scope.</p>
<p>The <code>export</code> statement tells the module what exactly is available to other files that import this module. We are just exporting a single function from the file, but we could export everything as well.</p>
<p>Let&rsquo;s see how we can consume the module -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// Caller.ts
</span></span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">MathOp</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&#34;./math-op&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">MathOp</span><span class="p">.</span><span class="nx">getSumDoub</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 9
</span></span></span></code></pre></div><p>We just use a variable <code>math</code>, import the module to that variable and use the exported function. The usage is &ldquo;normal&rdquo; and does not introduce any complexities!</p>
<p>Let&rsquo;s now try to access <code>double</code>, which is a variable in <code>math-op.ts</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// Caller.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//  ...
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">MathOp</span><span class="p">.</span><span class="kr">double</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2339: Property &#39;double&#39; does not exist on type &#39;{ getSumDoub: (x: number, y: number) =&gt; number; }&#39;
</span></span></span></code></pre></div><p>Any variable or method which is not exported from the module stay local to that module.</p>
<p>We can export the variable also, if required.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// math-op.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//  ...
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">getSumDoub</span><span class="o">:</span> <span class="nx">getSumDouble</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="kr">double</span><span class="o">:</span> <span class="kr">double</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>Now, we can get the value from the external file.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// Caller.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">MathOp</span><span class="p">.</span><span class="kr">double</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2
</span></span></span></code></pre></div><h3 id="export-a-class">Export a class</h3>
<p>A more common pattern that you see in the real world is exporting classes.</p>
<p>The module is rewritten to contain and export a class. You can then use that class and access its members and variables.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// math-op.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">class</span> <span class="nx">MathThis</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="kr">double</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">getSumDouble</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">)</span> <span class="o">**</span> <span class="k">this</span><span class="p">.</span><span class="kr">double</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>You can call and use this class like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// Caller.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">MathOp</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&#34;./math-op&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">mathMatters</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">.</span><span class="nx">MathThis</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">mathMatters</span><span class="p">.</span><span class="nx">getSumDouble</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 9
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Extend interfaces in Typescript</title>
      <link>https://techformist.com/extend-interfaces-typescript/</link>
      <pubDate>Fri, 11 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/extend-interfaces-typescript/</guid>
      <description>&lt;p&gt;Interface an interface. If that doesn&amp;rsquo;t excite you, I don&amp;rsquo;t know what will.&lt;/p&gt;
&lt;p&gt;We have seen &lt;a href=&#34;https://techformist.com/class-object-interface-typescript/&#34;&gt;interfaces used as types&lt;/a&gt; before. But as our God Goop says - &amp;ldquo;abstract; (while &amp;amp;&amp;amp; when) you can;&amp;rdquo;. So, we are here to know about interfaces for interfaces.&lt;/p&gt;
&lt;p&gt;Consider this simple example -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Borg&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, any class implementing the interface &lt;code&gt;Borg&lt;/code&gt; will have a name attribute.&lt;/p&gt;
&lt;p&gt;What if you want to add more attributes? Well, you can always add attributes to &lt;code&gt;Borg&lt;/code&gt;, but what if you have a function that very much likes names and cannot digest anything else?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Interface an interface. If that doesn&rsquo;t excite you, I don&rsquo;t know what will.</p>
<p>We have seen <a href="/class-object-interface-typescript/">interfaces used as types</a> before. But as our God Goop says - &ldquo;abstract; (while &amp;&amp; when) you can;&rdquo;. So, we are here to know about interfaces for interfaces.</p>
<p>Consider this simple example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">Borg</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Now, any class implementing the interface <code>Borg</code> will have a name attribute.</p>
<p>What if you want to add more attributes? Well, you can always add attributes to <code>Borg</code>, but what if you have a function that very much likes names and cannot digest anything else?</p>
<p>Or, you have security rules requiring you to obfuscate or hide stuff?</p>
<p>In all those cases and because we like to build incrementally and in a layered fashion, we should be looking at interfaces to interfaces.</p>
<p>For example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">Borg</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">Borger</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">ssn</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Now, we could have an object implementing <code>Borg</code> or <code>Borger</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">bo1</span><span class="o">:</span> <span class="nx">Borg</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Queen&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">co1</span><span class="o">:</span> <span class="nx">Borger</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Queen&#34;</span><span class="p">,</span> <span class="nx">ssn</span><span class="o">:</span> <span class="s2">&#34;collective&#34;</span> <span class="p">};</span>
</span></span></code></pre></div><p><code>Borger</code> must have <code>ssn</code> from parent interface and <code>name</code> from the inherited interface.</p>
<h3 id="finis">Finis</h3>
<p>The conversation at this point will be something like -</p>
<blockquote>
<p>You: &ldquo;Ok guy, I am excited. Let&rsquo;s derive some interfaces&rdquo;.</p>
</blockquote>
<blockquote>
<p>Me: &ldquo;You crazy? Why do you think I give names like &lsquo;Borg&rsquo; to the poor objects. Be careful about joining the collective.&rdquo;</p>
</blockquote>
<p>In reality: I don&rsquo;t typically use interfaces on interfaces on interfaces. I am just not fixated enough on object oriented patterns even after two decades of working with them.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Interfaces for Arrays in Typescript</title>
      <link>https://techformist.com/interfaces-arrays-typescript/</link>
      <pubDate>Thu, 10 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/interfaces-arrays-typescript/</guid>
      <description>&lt;p&gt;What exactly are interfaces for arrays?&lt;/p&gt;
&lt;p&gt;Previously we have seen &lt;a href=&#34;https://techformist.com/class-object-interface-typescript/&#34;&gt;interfaces as types&lt;/a&gt;. Interfaces provide useful abstraction on class and can be useful in tricky situations with complex types.&lt;/p&gt;
&lt;p&gt;But, what about interfaces for array?&lt;/p&gt;
&lt;p&gt;It turns out interfaces can be as easily applied for array types as well. They are just super useful as interfaces that define complex types and make arrays type-safe - nothing more, nothing less.&lt;/p&gt;
&lt;p&gt;Interfaces can define type for both array and its values. Let&amp;rsquo;s see an example.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>What exactly are interfaces for arrays?</p>
<p>Previously we have seen <a href="/class-object-interface-typescript/">interfaces as types</a>. Interfaces provide useful abstraction on class and can be useful in tricky situations with complex types.</p>
<p>But, what about interfaces for array?</p>
<p>It turns out interfaces can be as easily applied for array types as well. They are just super useful as interfaces that define complex types and make arrays type-safe - nothing more, nothing less.</p>
<p>Interfaces can define type for both array and its values. Let&rsquo;s see an example.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">iPlanet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">index</span><span class="o">:</span> <span class="nx">number</span><span class="p">]</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planets</span><span class="o">:</span> <span class="nx">iPlanet</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;earth&#34;</span><span class="p">,</span> <span class="s2">&#34;mars&#34;</span><span class="p">,</span> <span class="s2">&#34;mercury&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planets</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [ &#39;earth&#39;, &#39;mars&#39;, &#39;mercury&#39; ]
</span></span></span></code></pre></div><p>Did I hear you say that you learnt this doing Javascript in kindergarten?</p>
<p>Well, yes - very much possible.</p>
<p>But, did you use a different type of index? How about layering the complexity with objects as values or for index?</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">iPlanet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">index</span><span class="o">:</span> <span class="nx">string</span><span class="p">]</span><span class="o">:</span> <span class="nx">iPlaPo</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">iPlaPo</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">position</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">planets</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">iPlanet</span><span class="o">&gt;</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">planets</span><span class="p">[</span><span class="s2">&#34;earth&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span><span class="p">,</span> <span class="nx">position</span><span class="o">:</span> <span class="mi">3</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">planets</span><span class="p">[</span><span class="s2">&#34;mars&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;mars&#34;</span><span class="p">,</span> <span class="nx">position</span><span class="o">:</span> <span class="mi">4</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planets</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm">[
</span></span></span><span class="line"><span class="cl"><span class="cm">  earth: { name: &#39;earth&#39;, position: 3 },
</span></span></span><span class="line"><span class="cl"><span class="cm">  mars: { name: &#39;mars&#39;, position: 4 }
</span></span></span><span class="line"><span class="cl"><span class="cm">]
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><p>The example is not useful by itself. But you can quite imagine what it could be. Complicated data structures can be self-contained within arrays and subject to some sweet iterations.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Anonymous functions in Typescript</title>
      <link>https://techformist.com/anonymous-functions-typescript/</link>
      <pubDate>Wed, 09 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/anonymous-functions-typescript/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s talk anonymous functions and make them, well, &amp;ldquo;not anonymous&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Anonymous functions are just functions without names. If you have been following this blog, or have written some Javascript - you surely would have come across them.&lt;/p&gt;
&lt;p&gt;Anonymous functions are just function expressions. Let&amp;rsquo;s see a quick example.&lt;/p&gt;
&lt;p&gt;The following code block has a &amp;rsquo;named&amp;rsquo; function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can rewrite the same as an anonymous function and get the same end result.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let&rsquo;s talk anonymous functions and make them, well, &ldquo;not anonymous&rdquo;.</p>
<p>Anonymous functions are just functions without names. If you have been following this blog, or have written some Javascript - you surely would have come across them.</p>
<p>Anonymous functions are just function expressions. Let&rsquo;s see a quick example.</p>
<p>The following code block has a &rsquo;named&rsquo; function.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We can rewrite the same as an anonymous function and get the same end result.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getASum</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getASum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>As it was in Javascript, the function declaration in anonymous functions get compiled only when the runtime engine gets to the particular statement. In other words, anonymous functions are not hoisted.</p>
<p>&ldquo;Normal&rdquo; functions get parsed at the compile time, regardless of whether they are used or unused.</p>
<h3 id="wot-but-this-is-similar-arrow-functions">Wot? But, this is similar arrow functions?</h3>
<p>Yes, and no.</p>
<p>Arrow functions (or lambda functions) help us further the idea of Javascript - &ldquo;every function is an object&rdquo;. They allow us to pass around functions, and build incrementally complicated code that no one can understand.</p>
<p>Here&rsquo;s an arrow function.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getRSum</span> <span class="o">=</span> <span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getRSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>The only three differences -</p>
<ul>
<li>arrow functions can be named while anonymous functions wish to stay unnamed</li>
<li>more importantly: anonymous functions have their own <code>this</code> context and arguments object while arrow functions inherit from parent/scope</li>
<li>arrow functions cannot be called with <code>new</code> keyword</li>
</ul>
<p>For all practical purposes I just use arrow functions and call it a day.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Abstract classes in Typescript</title>
      <link>https://techformist.com/abstract-classes-typescript/</link>
      <pubDate>Tue, 08 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/abstract-classes-typescript/</guid>
      <description>&lt;p&gt;Why and how of using abstract classes in Typescript.&lt;/p&gt;
&lt;p&gt;We have seen a bit of &lt;a href=&#34;https://techformist.com/class-object-interface-typescript/&#34;&gt;classes and objects in Typescript&lt;/a&gt; previously. There was however a key aspect of object oriented programming missing there. Although we discussed inheriting classes, we never mentioned abstract classes.&lt;/p&gt;
&lt;p&gt;Sacrilege, that.&lt;/p&gt;
&lt;p&gt;On the other hand, anything goes for the daily blogging gobble-gobble.&lt;/p&gt;
&lt;p&gt;Abstract classes are meant to be inherited and are not used directly. Defining such an abstract class is painfully easy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Why and how of using abstract classes in Typescript.</p>
<p>We have seen a bit of <a href="/class-object-interface-typescript/">classes and objects in Typescript</a> previously. There was however a key aspect of object oriented programming missing there. Although we discussed inheriting classes, we never mentioned abstract classes.</p>
<p>Sacrilege, that.</p>
<p>On the other hand, anything goes for the daily blogging gobble-gobble.</p>
<p>Abstract classes are meant to be inherited and are not used directly. Defining such an abstract class is painfully easy.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">abstract</span> <span class="kr">class</span> <span class="nx">Planet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="kr">public</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;abstracted herein:&#34;</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Using abstract classes is easy too..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Planet</span><span class="p">(</span><span class="s2">&#34;Pluto&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2511: Cannot create an instance of an abstract class.
</span></span></span></code></pre></div><p>Sorry, wrong code block there. Let me correct that.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Earth</span> <span class="kr">extends</span> <span class="nx">Planet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">super</span><span class="p">(</span><span class="s2">&#34;earth&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earth</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Earth</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">earth</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// earth
</span></span></span></code></pre></div><p>Let&rsquo;s go ahead and throw an abstract method there and see the fun unravel.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">abstract</span> <span class="kr">class</span> <span class="nx">Planet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="kr">public</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;abstracted herein:&#34;</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">abstract</span> <span class="nx">printLife</span> <span class="o">=</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;everything&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Earth</span> <span class="kr">extends</span> <span class="nx">Planet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">super</span><span class="p">(</span><span class="s2">&#34;earth&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">printLife</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="k">void</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earth</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Earth</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">earth</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">earth</span><span class="p">.</span><span class="nx">printLife</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/*  earth
</span></span></span><span class="line"><span class="cl"><span class="cm">    everything 42
</span></span></span><span class="line"><span class="cl"><span class="cm">    undefined // function doesn&#39;t return anything
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><p>If you are wondering whatever the hell happened there -</p>
<ul>
<li>Create abstract class</li>
<li>Introduce a silly abstract method to <code>console.log</code> something</li>
<li>Extend <code>Planet</code> with a class aptly called <code>Earth</code>. <code>Earth</code> must implement the abstract method, else compilation fails</li>
<li>Create an instance of the derived class, again aptly named as <code>earth</code></li>
<li>Make everyone reach nirvana by <code>consoling</code> some statements</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Non-number values for enum in Typescript</title>
      <link>https://techformist.com/enum-non-number-values-typescript/</link>
      <pubDate>Sun, 06 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/enum-non-number-values-typescript/</guid>
      <description>&lt;p&gt;Use non-numbers in Typescript enums.&lt;/p&gt;
&lt;p&gt;enums have the following typical definition and usage -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Colors&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;blue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;green&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Colors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// blue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or, the numbers can be explicitly specified..&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Colors&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;red&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;blue&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;green&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Colors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// red
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Colors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;red&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since Typescript v2.2, we can also specify non-numbers against the value.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;FruitColors&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;apple&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;red&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;orange&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;orange&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FruitColors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// red
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or, you could go crazy with more complex objects (but, why?).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Use non-numbers in Typescript enums.</p>
<p>enums have the following typical definition and usage -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">enum</span> <span class="nx">Colors</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">red</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">blue</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">green</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Colors</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// blue
</span></span></span></code></pre></div><p>Or, the numbers can be explicitly specified..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">enum</span> <span class="nx">Colors</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">red</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">blue</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">green</span> <span class="o">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Colors</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// red
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Colors</span><span class="p">[</span><span class="s2">&#34;red&#34;</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>Since Typescript v2.2, we can also specify non-numbers against the value.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">enum</span> <span class="nx">FruitColors</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">apple</span> <span class="o">=</span> <span class="s2">&#34;red&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">orange</span> <span class="o">=</span> <span class="s2">&#34;orange&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">FruitColors</span><span class="p">[</span><span class="s1">&#39;apple&#39;</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// red
</span></span></span></code></pre></div><p>Or, you could go crazy with more complex objects (but, why?).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">enum</span> <span class="nx">Fruit</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">apple</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">any</span><span class="o">&gt;</span><span class="p">{</span> <span class="nx">color</span><span class="o">:</span> <span class="s2">&#34;red&#34;</span><span class="p">,</span> <span class="nx">flavor</span><span class="o">:</span> <span class="s2">&#34;sweet&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">orange</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">any</span><span class="o">&gt;</span><span class="p">{</span> <span class="nx">color</span><span class="o">:</span> <span class="s2">&#34;orange&#34;</span><span class="p">,</span> <span class="nx">flavor</span><span class="o">:</span> <span class="s2">&#34;sweet&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Fruit</span><span class="p">[</span><span class="s2">&#34;apple&#34;</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { color: &#39;red&#39;, flavor: &#39;sweet&#39; }
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Decorators in Typescript</title>
      <link>https://techformist.com/decorators-typescript/</link>
      <pubDate>Sat, 05 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/decorators-typescript/</guid>
      <description>&lt;p&gt;Decorate a class, member or property to signify its specialty.&lt;/p&gt;
&lt;p&gt;Decorators are not available in Javascript but enable us to enhance our Typescript libraries and code. Decorators are experimental features in Typescript at this time.&lt;/p&gt;
&lt;p&gt;A decorator is a way to annotate or modify a class, properties, functions or parameters. Decorator is specified against a target class, and has a body that indicates the decorator&amp;rsquo;s function.&lt;/p&gt;
&lt;p&gt;A decorator exists in brought to life in two parts -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Decorate a class, member or property to signify its specialty.</p>
<p>Decorators are not available in Javascript but enable us to enhance our Typescript libraries and code. Decorators are experimental features in Typescript at this time.</p>
<p>A decorator is a way to annotate or modify a class, properties, functions or parameters. Decorator is specified against a target class, and has a body that indicates the decorator&rsquo;s function.</p>
<p>A decorator exists in brought to life in two parts -</p>
<ol>
<li>
<p>Define a function to apply against target class, property etc.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">specialpower</span><span class="p">(</span><span class="nx">meta</span><span class="o">:</span> <span class="nx">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
<li>
<p>Then, the decorator is specified against the class, member, etc.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">@</span><span class="nx">specialpower</span>
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Human</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ..
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ol>
<p>More than one decorator can be applied in one go.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">@</span><span class="nx">eat</span>
</span></span><span class="line"><span class="cl"><span class="err">@</span><span class="nx">repeat</span>
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Human</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ..
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The functions are evaluated left to right, and then, top to bottom, as applicable. The results are then called from the last evaluation from previous step to the first.</p>
<p>As an example, consider the below decorator to add a new property to the class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">propPower</span><span class="p">(</span><span class="nx">constr</span><span class="o">:</span> <span class="nx">any</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="kr">class</span> <span class="kr">extends</span> <span class="nx">constr</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">power</span> <span class="o">=</span> <span class="s2">&#34;life&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Next, we specify the decorator against the class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">@</span><span class="nx">propPower</span>
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Planet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">()</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We can see the power added to the class without any further action from our end -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earth</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Planet</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">earth</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// class_1 { power: &#39;life&#39; }
</span></span></span></code></pre></div><p>You can see the potential here - we can start adding &ldquo;stuff&rdquo; to props, members and classes, and take Typescript to all new levels. But remember - they are experimental and can change.</p>
<p>If you cannot wait to see decorators today - you can always use NestJS or Angular frameworks. They have decorator support built in and people seem to go crazy about them (I am neutral).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Type casting in Typescript</title>
      <link>https://techformist.com/type-casting-typescript/</link>
      <pubDate>Fri, 04 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/type-casting-typescript/</guid>
      <description>&lt;p&gt;&amp;ldquo;Typecast types in Typescript&amp;rdquo; : that&amp;rsquo;s three &amp;ldquo;types&amp;rdquo; in a sentence with three significant words, and for that, I should tap out (but I don&amp;rsquo;t).&lt;/p&gt;
&lt;p&gt;We see a lot about &amp;ldquo;type assertions&amp;rdquo; in to type conversations (or conversions!) in Typescript. Type assertions enable you to override default type inference for neutral types. We have discussed about &lt;a href=&#34;https://techformist.com/type-assertion-typescript/&#34;&gt;type assertion&lt;/a&gt; before.&lt;/p&gt;
&lt;p&gt;Typecasting refers to type conversions. While they don&amp;rsquo;t function similar to other strongly typed languages, they do exist.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&ldquo;Typecast types in Typescript&rdquo; : that&rsquo;s three &ldquo;types&rdquo; in a sentence with three significant words, and for that, I should tap out (but I don&rsquo;t).</p>
<p>We see a lot about &ldquo;type assertions&rdquo; in to type conversations (or conversions!) in Typescript. Type assertions enable you to override default type inference for neutral types. We have discussed about <a href="/type-assertion-typescript/">type assertion</a> before.</p>
<p>Typecasting refers to type conversions. While they don&rsquo;t function similar to other strongly typed languages, they do exist.</p>
<p>We will see more of type assertions and casting after this preface.</p>
<h2 id="types-you-say">Types, you say?</h2>
<p>For a basic introduction of &ldquo;types&rdquo; - head over to <a href="https://techformist.com/types-in-typescript/">types in Typescript</a> and <a href="https://techformist.com/typing-javascript/">Javascript types</a>.</p>
<p>Typescript supports -</p>
<ul>
<li>built-in types (basic e.g. <code>number</code>, <code>string</code>, <code>boolean</code>,and special types e.g. <code>any</code>, <code>unknown</code>)</li>
<li>additional types (e.g. collections like <code>enum</code> and even user-defined types)</li>
</ul>
<p>You define variables with types -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">decimal</span>: <span class="kt">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">color</span>: <span class="kt">string</span> <span class="o">=</span> <span class="s2">&#34;indigo&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// anything, really
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">notSure</span>: <span class="kt">any</span> <span class="o">=</span> <span class="s2">&#34;abc&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// collections
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">list</span>: <span class="kt">number</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">enum</span> <span class="nx">Color</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Red</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Green</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Blue</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">c</span>: <span class="kt">Color</span> <span class="o">=</span> <span class="nx">Color</span><span class="p">.</span><span class="nx">Green</span><span class="p">;</span>
</span></span></code></pre></div><p>It&rsquo;s all a good world with types until it isn&rsquo;t. It so happens that -</p>
<ul>
<li>you (think you) know more than what the compiler knows. You want to tell compiler that a variable is of a specific type.</li>
<li>values may need to be moved across types in the course of doing something</li>
</ul>
<h2 id="type-assertions-and-typecasting">Type Assertions and Typecasting</h2>
<p>The process of changing types is what is called &ldquo;type casting&rdquo;. Typecasting in strongly typed languages like C# allow us to convert types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="kt">string</span> <span class="n">numStr</span> <span class="p">=</span> <span class="s">&#34;123&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">numNum</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">bool</span> <span class="n">isParsable</span> <span class="p">=</span> <span class="n">Int32</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="n">numStr</span><span class="p">,</span> <span class="k">out</span> <span class="n">numNum</span><span class="p">);</span>
</span></span></code></pre></div><p>The code checks whether a given string is a valid number and outputs the number. The &ldquo;string&rdquo; or &ldquo;number&rdquo; types are treated in a consistent way by both the compiler and runtime engine.</p>
<p>Typescript behaves differently. It is compiled to Javascript, which does not give two hoots about your defined types, and there is no &ldquo;runtime&rdquo; to enforce types during execution. All Typescript can do is to apply all its smarts during compilation of Typescript to Javascript code.</p>
<p>Type assertions let the Typescript compiler know that a given variable should be treated as belonging to a certain type. There are no &ldquo;exceptions&rdquo; or data restructuring associated with assertions, except minimal validations (we refer this behaviour as &ldquo;validations that are applied statically&rdquo;).</p>
<p>But, implicit types do exist during program execution, and type conversion behaves similar to Javascript since the execution engine is, well, Javascript. But, you need to make explicit conversions in Typescript to humour the compiler, and probably, everyone else in your team.</p>
<blockquote>
<p>Aside: IMO it is more fun to use implicit conversions that reduce code, confuse people and make it hard to write tests.</p>
</blockquote>
<h2 id="when--where-to-use-type-casting-and-type-assertion">When &amp; where to use type casting and type assertion?</h2>
<p>Type assertions helps you to force types when you are not in control of them. For e.g. -</p>
<ol>
<li>you are processing user data (with unreliable types)</li>
<li>working with data that has changed shape over years (employee code was numeric, now it is alphanumeric :))</li>
<li>receiving data from an external program</li>
</ol>
<p>Consider this example that uses <code>any</code>, a special type that represents any type in Typescript. You convert <code>any</code> to a specific type to process it further -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">whatanum</span>: <span class="kt">any</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">whatanum</span> <span class="o">=</span> <span class="s2">&#34;is this the answer to everything?&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">whatanum</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span></code></pre></div><p>We can start with <code>any</code> and use type assertion to denote that the variable is in fact a number.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">whatNum</span>: <span class="kt">any</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">reallyNum</span> <span class="o">=</span> <span class="p">&lt;</span><span class="nt">number</span><span class="p">&gt;</span><span class="nx">whatNum</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">reallyNum</span><span class="p">);</span> <span class="c1">// number
</span></span></span></code></pre></div><p>Or, consider this example with <code>unknown</code>, another special type in Typescript -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">clueless</span>: <span class="kt">unknown</span> <span class="o">=</span> <span class="s2">&#34;1&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">clueNum</span>: <span class="kt">number</span> <span class="o">=</span> <span class="p">&lt;</span><span class="nt">number</span><span class="p">&gt;</span><span class="nx">clueless</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// another format
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">clueNumPreferred</span> <span class="o">=</span> <span class="nx">clueless</span> <span class="kr">as</span> <span class="kt">number</span><span class="p">;</span>
</span></span></code></pre></div><p>The compiler does not know better about <code>any</code> or <code>unknown</code> variables to process further - so we make the compiler &ldquo;see&rdquo; the variables for what they really are.</p>
<p>Typecasting, on the other hand, helps you to convert types and provide consistent (expected) results :). For e.g. -</p>
<ol>
<li>concatenation of a number and string</li>
<li>convert arrays of numbers to strings for formatting and display</li>
</ol>
<h2 id="how-do-i-assert-types">How do I assert types?</h2>
<p>There are two ways to do type assertions.</p>
<ol>
<li>Bracket syntax. e.g. <code>let length: number = (&lt;string&gt;lengthField);</code></li>
<li>Use <code>as</code>. e.g. <code>let length: number = (lengthField as string);</code></li>
</ol>
<p>There is no difference between the two ways and the end result is always the same. Note that if you are using JSX you have to use <code>as</code> syntax.</p>
<h2 id="type-conversion-in-typescript">Type conversion in Typescript</h2>
<p>Converting specific types is similar to Javascript.</p>
<h4 id="from-_-to-string">From _ to String</h4>
<p>We convert any type to string by using <code>String(x)</code> or <code>x.toString</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">String</span><span class="p">(</span><span class="mi">42</span><span class="p">));</span> <span class="c1">//&#34;42&#34;
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nb">String</span><span class="p">(</span><span class="mi">42</span><span class="p">));</span> <span class="c1">// &#34;string&#34;
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">String</span><span class="p">(</span><span class="kc">true</span><span class="p">));</span> <span class="c1">//&#34;true&#34;
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">String</span><span class="p">(</span><span class="kc">undefined</span><span class="p">));</span> <span class="c1">//&#34;undefined&#34;
</span></span></span></code></pre></div><h4 id="from-_-to-number">From _ to Number</h4>
<p>This is so radically different from string.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="nb">Number</span><span class="p">(</span><span class="s2">&#34;0&#34;</span><span class="p">);</span> <span class="c1">// 0
</span></span></span><span class="line"><span class="cl"><span class="nb">Number</span><span class="p">(</span><span class="s2">&#34;abc&#34;</span><span class="p">);</span> <span class="c1">//NaN
</span></span></span><span class="line"><span class="cl"><span class="nb">Number</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span> <span class="c1">// 1
</span></span></span></code></pre></div><p>There are additional helper functions that, well, help you do strange things -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nb">parseInt</span><span class="p">(</span><span class="s2">&#34;42life&#34;</span><span class="p">);</span> <span class="c1">//42
</span></span></span><span class="line"><span class="cl"><span class="nb">parseFloat</span><span class="p">(</span><span class="s2">&#34;3.14pi&#34;</span><span class="p">);</span> <span class="c1">//3.14
</span></span></span></code></pre></div><h4 id="from-_-to-boolean">From _ to Boolean</h4>
<p>Convert &ldquo;stuff&rdquo; to boolean.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nb">Boolean</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nb">Boolean</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span> <span class="c1">// false
</span></span></span></code></pre></div><h4 id="from-object-to-array">From <code>object</code> to <code>array</code></h4>
<p>Yes, you read that right - let&rsquo;s see an example of converting object to array in style. Not quite a glaring example of &ldquo;type conversions&rdquo;, but apparently, people stare in awe at such code.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planets</span>: <span class="kt">Object</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">mercury</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Mercury&#34;</span><span class="p">,</span> <span class="nx">position</span>: <span class="kt">1</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">venus</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Venus&#34;</span><span class="p">,</span> <span class="nx">position</span>: <span class="kt">2</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">earth</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Earth&#34;</span><span class="p">,</span> <span class="nx">position</span>: <span class="kt">3</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planetsArr</span>: <span class="kt">Array</span><span class="p">&lt;</span><span class="nt">Object</span><span class="p">&gt;</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">planets</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nx">key</span>: <span class="kt">string</span><span class="p">)</span><span class="o">:</span> <span class="kt">string</span> <span class="o">=&gt;</span> <span class="nx">planets</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;planetsArr&#34;</span><span class="p">,</span> <span class="nx">planetsArr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* 
</span></span></span><span class="line"><span class="cl"><span class="cm">output:
</span></span></span><span class="line"><span class="cl"><span class="cm">[
</span></span></span><span class="line"><span class="cl"><span class="cm">  { name: &#34;Mercury&#34;, position: 1 },
</span></span></span><span class="line"><span class="cl"><span class="cm">  { name: &#34;Venus&#34;, position: 2 },
</span></span></span><span class="line"><span class="cl"><span class="cm">  { name: &#34;Earth&#34;, position: 3 },
</span></span></span><span class="line"><span class="cl"><span class="cm">]
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h2 id="the-end">The End</h2>
<p>We saw type assertions, typecasting and examples of type conversions. Hopefully that has confused you a bit more about the wonderful world of types.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Typing collections in Typescript</title>
      <link>https://techformist.com/typing-collections-typescript/</link>
      <pubDate>Thu, 03 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/typing-collections-typescript/</guid>
      <description>&lt;p&gt;How are collections typed in Typescript?&lt;/p&gt;
&lt;p&gt;Primitives are fairly easy to type - we have seen this while &lt;a href=&#34;https://techformist.com/what-typescript&#34;&gt;discussing Typescript&lt;/a&gt; and &lt;a href=&#34;https://techformist.com/types-in-typescript/&#34;&gt;its types&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We have seen examples of typed arrays in the same post, but how about all the other collections? How far down the typed rabbit hole are you willing to go?&lt;/p&gt;
&lt;h3 id=&#34;arrays&#34;&gt;Arrays&lt;/h3&gt;
&lt;p&gt;There are two useful notations - pick one, or both.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;numToo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tuples&#34;&gt;Tuples&lt;/h3&gt;
&lt;p&gt;Tuples, unlike arrays, have fixed number of elements. In Typescript, we just go about typing all of them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>How are collections typed in Typescript?</p>
<p>Primitives are fairly easy to type - we have seen this while <a href="/what-typescript">discussing Typescript</a> and <a href="/types-in-typescript/">its types</a>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">num</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">msg</span><span class="o">:</span> <span class="nx">string</span> <span class="o">=</span> <span class="s2">&#34;hello&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>We have seen examples of typed arrays in the same post, but how about all the other collections? How far down the typed rabbit hole are you willing to go?</p>
<h3 id="arrays">Arrays</h3>
<p>There are two useful notations - pick one, or both.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">num</span><span class="o">:</span> <span class="nx">number</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numToo</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">number</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span>
</span></span></code></pre></div><h3 id="tuples">Tuples</h3>
<p>Tuples, unlike arrays, have fixed number of elements. In Typescript, we just go about typing all of them.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">life</span><span class="o">:</span> <span class="p">[</span><span class="nx">string</span><span class="p">,</span> <span class="nx">number</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;everything&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">];</span>
</span></span></code></pre></div><h3 id="objects">Objects</h3>
<p>Keys can have their own types in Typescript Objects.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">position</span><span class="o">:</span> <span class="nx">number</span> <span class="p">}</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">position</span><span class="o">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>You can use objects to instantiate the class..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Planet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="kr">public</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">,</span> <span class="kr">public</span> <span class="nx">position</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earth</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Planet</span><span class="p">(</span><span class="s2">&#34;earth&#34;</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="map">Map</h3>
<p>Just like Javascript, a <code>map</code> is an object that stores a key-value pair.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Map</span><span class="o">&lt;</span><span class="nx">string</span><span class="p">,</span> <span class="nx">string</span><span class="o">&gt;</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s2">&#34;name&#34;</span><span class="p">,</span> <span class="s2">&#34;earth&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s2">&#34;position&#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Map { &#39;name&#39; =&gt; &#39;earth&#39;, &#39;position&#39; =&gt; &#39;1&#39; }
</span></span></span></code></pre></div><p>The key and value can have any type - we just happen to use strings for both.</p>
<h3 id="set">Set</h3>
<p>A <code>set</code> is an ordered list of values with no duplicates.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Set</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&#34;earth&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Set { &#39;earth&#39; }
</span></span></span></code></pre></div><h3 id="weakmap-and-weakset">WeakMap and WeakSet</h3>
<p><code>WeakMap</code> and <code>WeakSet</code> behave like their strong counterparts, but with an object for key. They very much resemble what they can do in Javascript but with types.</p>
<p>Consider this example for <code>WeakMap</code>..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">WeakMap</span><span class="o">&lt;</span><span class="p">{</span> <span class="nx">bodyType</span><span class="o">:</span> <span class="nx">string</span> <span class="p">},</span> <span class="nx">string</span><span class="o">&gt;</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">set</span><span class="p">({</span> <span class="nx">bodyType</span><span class="o">:</span> <span class="s2">&#34;planet&#34;</span> <span class="p">},</span> <span class="s2">&#34;earth&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>.. and, for the <code>WeakSet</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">WeakSet</span><span class="o">&lt;</span><span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span> <span class="p">}</span><span class="o">&gt;</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">add</span><span class="p">({</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span> <span class="p">});</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Access modifiers in Typescript</title>
      <link>https://techformist.com/access-modifiers-typescript/</link>
      <pubDate>Mon, 30 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/access-modifiers-typescript/</guid>
      <description>&lt;p&gt;Typescript supports &lt;code&gt;public&lt;/code&gt;, &lt;code&gt;private&lt;/code&gt; and &lt;code&gt;protected&lt;/code&gt; modifiers that affect the accessibility of class in different ways.&lt;/p&gt;
&lt;p&gt;Access modifiers further a core concept of object oriented programming - &amp;rsquo;encapsulation&amp;rsquo;. The accessibility of variables and members of a class are driven by modifiers and therefore controlled in the programming flow.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with a simple &lt;code&gt;class&lt;/code&gt; example.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;MathOp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;z&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;public-modifier&#34;&gt;Public modifier&lt;/h3&gt;
&lt;p&gt;All variables and members are public by default in Typescript.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Typescript supports <code>public</code>, <code>private</code> and <code>protected</code> modifiers that affect the accessibility of class in different ways.</p>
<p>Access modifiers further a core concept of object oriented programming - &rsquo;encapsulation&rsquo;. The accessibility of variables and members of a class are driven by modifiers and therefore controlled in the programming flow.</p>
<p>Let&rsquo;s start with a simple <code>class</code> example.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">public</span> <span class="nx">x</span><span class="o">:</span><span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kr">private</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kr">protected</span> <span class="nx">z</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="public-modifier">Public modifier</h3>
<p>All variables and members are public by default in Typescript.</p>
<p>So, I may as well type -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>.. and no one will leave the chat.</p>
<p>Public variables and members are accessible by anybody outside the class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">op</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>Let&rsquo;s add and test a method in the class -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">x</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">double</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">x</span> <span class="o">*</span> <span class="nx">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">op</span><span class="p">.</span><span class="kr">double</span><span class="p">(</span><span class="mi">3</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 9
</span></span></span></code></pre></div><h3 id="private-modifier">Private modifier</h3>
<p>Private modifiers are not accessible outside the class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">op</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  error TS2341: Property &#39;y&#39; is private and only accessible within class &#39;MathOp&#39;.
</span></span></span></code></pre></div><p>Private variables are accessed through members - if at all they need to be accessed.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">getY</span><span class="p">()</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">op</span><span class="p">.</span><span class="nx">getY</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>Members behave the same way as variables. Private members are used to perform operations within the class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">private</span> <span class="nx">myFunc</span><span class="o">:</span><span class="k">void</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// do stuff
</span></span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="protected-modifier">Protected modifier</h3>
<p>Protected members can be accessed within the class and by the derived classes. They cannot be accessed outside of that scope.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">protected</span> <span class="nx">z</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">newMathOp</span> <span class="kr">extends</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">super</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">newOp</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">newMathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm"> 3
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><p>Protected variables and members are not accessible from extended-class instances as well as class instances.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Static variables and methods in Typescript</title>
      <link>https://techformist.com/static-variables-methods-typescript/</link>
      <pubDate>Sun, 29 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/static-variables-methods-typescript/</guid>
      <description>&lt;p&gt;Typescript allows use of static variables and methods just like modern Javascript.&lt;/p&gt;
&lt;p&gt;Static variables and methods are declared with a keyword &lt;code&gt;static&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;static-variables&#34;&gt;Static variables&lt;/h3&gt;
&lt;p&gt;Static variables exist within the class context, and are not carried forward to the object of the class.&lt;/p&gt;
&lt;p&gt;Define a static variable like so -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Human&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;chaos&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The variable value is accessible using the class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Human&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;chaos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;.. but not against the object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;joe&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Human&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;joe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;chaos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// error TS2576: Property &amp;#39;chaos&amp;#39; is a static member of type &amp;#39;Human&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you need a value in the object no matter the costs, you can always have the two variables with same names.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Typescript allows use of static variables and methods just like modern Javascript.</p>
<p>Static variables and methods are declared with a keyword <code>static</code>.</p>
<h3 id="static-variables">Static variables</h3>
<p>Static variables exist within the class context, and are not carried forward to the object of the class.</p>
<p>Define a static variable like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Human</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">static</span> <span class="nx">chaos</span><span class="o">:</span> <span class="kr">boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The variable value is accessible using the class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Human</span><span class="p">.</span><span class="nx">chaos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// true
</span></span></span></code></pre></div><p>.. but not against the object.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">joe</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Human</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">joe</span><span class="p">.</span><span class="nx">chaos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2576: Property &#39;chaos&#39; is a static member of type &#39;Human&#39;
</span></span></span></code></pre></div><p>If you need a value in the object no matter the costs, you can always have the two variables with same names.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Human</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">static</span> <span class="nx">chaos</span><span class="o">:</span> <span class="kr">boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">chaos</span><span class="o">:</span> <span class="kr">boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Human</span><span class="p">.</span><span class="nx">chaos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// true
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">joe</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Human</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">joe</span><span class="p">.</span><span class="nx">chaos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// true
</span></span></span></code></pre></div><h3 id="static-methods--members">Static methods / members</h3>
<p>Static methods behave similar to static variables.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Human</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">static</span> <span class="nx">chaos</span><span class="o">:</span> <span class="kr">boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">chaos</span><span class="o">:</span> <span class="kr">boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">static</span> <span class="nx">checkExists</span><span class="p">()</span><span class="o">:</span> <span class="nx">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;exists&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">doubleCheckExists</span><span class="p">()</span><span class="o">:</span> <span class="nx">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;exists&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Human</span><span class="p">.</span><span class="nx">checkExists</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// exists
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// console.log(Human.doubleCheckExists());
</span></span></span><span class="line"><span class="cl"><span class="c1">// error - cannot call a instance member
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">joe</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Human</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">joe</span><span class="p">.</span><span class="nx">doubleCheckExists</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">//exists
</span></span></span></code></pre></div><p>Note that static variables cannot be called by instance members and vice-versa.</p>
<p>Static variables / members are distinct from their instance counterparts at all times.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Type Assertion in Typescript</title>
      <link>https://techformist.com/type-assertion-typescript/</link>
      <pubDate>Sat, 28 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/type-assertion-typescript/</guid>
      <description>&lt;p&gt;Typescript&amp;rsquo;s type assertion features help us to override type inference and indicate a specific type to a variable.&lt;/p&gt;
&lt;p&gt;Type assertion may not be the most common of the features you employ, but it is invaluable when you are migrating from Javascript. Or, when you have to interact with Javascript libraries or data from external systems in your Typescript code.&lt;/p&gt;
&lt;p&gt;Take note of one important thing though - since all Typescript code is compiled to Javascript, any and all assertion is applied at compile time. There is no runtime type assertion.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Typescript&rsquo;s type assertion features help us to override type inference and indicate a specific type to a variable.</p>
<p>Type assertion may not be the most common of the features you employ, but it is invaluable when you are migrating from Javascript. Or, when you have to interact with Javascript libraries or data from external systems in your Typescript code.</p>
<p>Take note of one important thing though - since all Typescript code is compiled to Javascript, any and all assertion is applied at compile time. There is no runtime type assertion.</p>
<p>So, how do you type assert anything?</p>
<h3 id="type-assertion-for-simple-variables">Type assertion for simple variables</h3>
<p>Consider this very simple example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">one</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span></code></pre></div><p>In the normal course of time, you end up treating <code>one</code> as a number.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">oneOne</span> <span class="o">=</span> <span class="nx">one</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;oneOne: &#34;</span><span class="p">,</span> <span class="nx">oneOne</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2
</span></span></span></code></pre></div><p>But, what if you want to promote <code>one</code> to a string? This is where assertion plays a part - you can tell Typescript to treat <code>one</code> as a string rather than infer it as a number.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">realOne</span><span class="o">:</span> <span class="nx">string</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span><span class="nx">one</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;realOne: &#34;</span><span class="p">,</span> <span class="nx">realOne</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p><code>realOne</code> is a string representation of the <code>any</code> typed <code>one</code>. It can lend itself well to string operations as expected.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">realOne</span> <span class="o">+</span> <span class="s2">&#34;two&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1two
</span></span></span></code></pre></div><p>You could also do the same assertion using an alternate syntax. Use <code>one as</code> instead of <code>&lt;&gt;</code> syntax.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">one</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">realOne</span><span class="o">:</span> <span class="nx">string</span> <span class="o">=</span> <span class="nx">one</span> <span class="nx">as</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">realOne</span> <span class="o">+</span> <span class="s2">&#34;two&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1two
</span></span></span></code></pre></div><h3 id="type-assertion-in-objects">Type assertion in objects</h3>
<p>Let&rsquo;s take a look at a recently used example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2339: Property &#39;name&#39; does not exist on type &#39;{}&#39;.
</span></span></span></code></pre></div><p>As seen in <a href="/initialize-object-props-later-typescript/">another post</a> <code>planet</code> is treated as a variable with type <code>{}</code> and therefore, <code>planet.name</code> will throw an error.</p>
<p>We can solve this problem by manually inferring the type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">iPlanet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">position</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">iPlanet</span><span class="o">&gt;</span><span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;earth&#39; }
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Initialize empty object and add props</title>
      <link>https://techformist.com/initialize-object-props-later-typescript/</link>
      <pubDate>Thu, 26 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/initialize-object-props-later-typescript/</guid>
      <description>&lt;p&gt;There are situations when you need to initialize object without props. How do you manage that it Typescript?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s consider the example below. First, we declare the object and initialize it to an empty object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, we add the props -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;earth&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above initialization + assignment combination is perfectly valid in Javascript.&lt;/p&gt;
&lt;p&gt;But Typescript does not agree with &lt;code&gt;planet.name&lt;/code&gt; since the object was declared as type &lt;code&gt;{}&lt;/code&gt; (an empty object).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There are situations when you need to initialize object without props. How do you manage that it Typescript?</p>
<p>Let&rsquo;s consider the example below. First, we declare the object and initialize it to an empty object.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{};</span>
</span></span></code></pre></div><p>Then, we add the props -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>The above initialization + assignment combination is perfectly valid in Javascript.</p>
<p>But Typescript does not agree with <code>planet.name</code> since the object was declared as type <code>{}</code> (an empty object).</p>
<p>Ideally, the fix will be to declare and initialize with the actual props.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span> <span class="p">};</span>
</span></span></code></pre></div><p>But, this is not always possible. You may also have to interact with Javascript or migrate large chunks of code, which makes the process more challenging.</p>
<p>A quick fix to the problem is to simply do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{}</span> <span class="nx">as</span> <span class="nx">any</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>Or, if you can, change the prop assignment to a more dynamic property assignment do the below -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;name&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>The dynamic assignment functions just like Javascript and you don&rsquo;t have any type advantages.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Readonly Properties in Typescript</title>
      <link>https://techformist.com/readonly-props-typescript/</link>
      <pubDate>Tue, 24 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/readonly-props-typescript/</guid>
      <description>&lt;p&gt;Typescript provides a way to indicate props in an object / type, or an entire type, as read only.&lt;/p&gt;
&lt;h3 id=&#34;props-in-an-object&#34;&gt;Props in an object&lt;/h3&gt;
&lt;p&gt;Consider this example -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Fruit&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;readonly&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;color&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;red&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the code block we have specified the prop &lt;code&gt;name&lt;/code&gt; as read-only.&lt;/p&gt;
&lt;p&gt;We can very much change the color of an object derived from &lt;code&gt;Fruit&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;apple&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Fruit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Fruit { name: &amp;#39;apple&amp;#39;, color: &amp;#39;red&amp;#39; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;color&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Fruit { name: &amp;#39;apple&amp;#39;, color: &amp;#39;blue&amp;#39; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, we cannot change the name -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Typescript provides a way to indicate props in an object / type, or an entire type, as read only.</p>
<h3 id="props-in-an-object">Props in an object</h3>
<p>Consider this example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">readonly</span> <span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;apple&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;red&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>In the code block we have specified the prop <code>name</code> as read-only.</p>
<p>We can very much change the color of an object derived from <code>Fruit</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">apple</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">apple</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Fruit { name: &#39;apple&#39;, color: &#39;red&#39; }
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">apple</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;blue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">apple</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Fruit { name: &#39;apple&#39;, color: &#39;blue&#39; }
</span></span></span></code></pre></div><p>But, we cannot change the name -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">apple</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;orange&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2540: Cannot assign to &#39;name&#39; because it is a read-only property
</span></span></span></code></pre></div><p>In normal Javascript, you would have defined the property as non-writable using <a href="/property-descriptors-in-javascript/">property descriptors</a> to achieve the same effect.</p>
<h3 id="props-in-a-type">Props in a type</h3>
<p>We create types similar to an object, and we can make one or more of the props read-only.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">type</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">readonly</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">newFruit</span><span class="o">:</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;apple&#34;</span><span class="p">,</span> <span class="nx">color</span><span class="o">:</span> <span class="s2">&#34;red&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">newFruit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;apple&#39;, color: &#39;red&#39; }
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">newFruit</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;blue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">newFruit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;apple&#39;, color: &#39;blue&#39; }
</span></span></span></code></pre></div><p>Note that setting <code>name</code> during initialization is allowed, but the prop cannot be changed later.</p>
<h3 id="all-props-in-a-type">All props in a type</h3>
<p>We can make entire types as read-only by processing it through a <code>Readonly</code> type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">type</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span><span class="o">:</span> <span class="nx">string</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">type</span> <span class="nx">ReadFruit</span> <span class="o">=</span> <span class="nx">Readonly</span><span class="o">&lt;</span><span class="nx">Fruit</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">apple</span><span class="o">:</span> <span class="nx">ReadFruit</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;apple&#34;</span><span class="p">,</span> <span class="nx">color</span><span class="o">:</span> <span class="s2">&#34;red&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;apple: &#34;</span><span class="p">,</span> <span class="nx">apple</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// apple:  { name: &#39;apple&#39;, color: &#39;red&#39; }
</span></span></span></code></pre></div><p>We get an error if we try to change any prop -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">apple</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;orange&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2540: Cannot assign to &#39;name&#39; because it is a read-only property.
</span></span></span></code></pre></div><p>In normal Javascript, you can achieve the same effect using <code>Object.freeze()</code>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Typeguards in Typescript</title>
      <link>https://techformist.com/typeguards-typescript/</link>
      <pubDate>Mon, 23 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/typeguards-typescript/</guid>
      <description>&lt;p&gt;Typeguards enable us to process function arguments based on their types.&lt;/p&gt;
&lt;p&gt;Consider this example -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// hello
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What if we want to use &lt;code&gt;join&lt;/code&gt; for strings &lt;em&gt;or&lt;/em&gt; numbers? We can do a &lt;a href=&#34;https://techformist.com/mix-match-types-typescript/&#34;&gt;union type&lt;/a&gt; like so -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// hello
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, a real world problem would lie in processing the input arguments - not just returning them. Also, the methods and properties of the argument will change within a function based on their types. Typescript solves this problem using Typeguard.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Typeguards enable us to process function arguments based on their types.</p>
<p>Consider this example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">join</span><span class="p">(</span><span class="nx">a</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span><span class="o">:</span> <span class="nx">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">));</span> <span class="c1">// hello
</span></span></span></code></pre></div><p>What if we want to use <code>join</code> for strings <em>or</em> numbers? We can do a <a href="/mix-match-types-typescript/">union type</a> like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">join</span><span class="p">(</span><span class="nx">a</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">));</span> <span class="c1">// hello
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span> <span class="c1">// 1
</span></span></span></code></pre></div><p>But, a real world problem would lie in processing the input arguments - not just returning them. Also, the methods and properties of the argument will change within a function based on their types. Typescript solves this problem using Typeguard.</p>
<p>Typeguard is a way if isolating types within an argument in specific blocks. Typescript provides different ways of solving this problem in different situations - <code>typeof</code>, <code>instanceof</code>, literals and <code>in</code>. You can also go ahead and create your own typeguards if none of those satisfy your use case.</p>
<h3 id="typeof">typeof</h3>
<p>We can build on the previous example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">join</span><span class="p">(</span><span class="nx">a</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">a</span> <span class="o">==</span> <span class="s2">&#34;string&#34;</span> <span class="o">&amp;&amp;</span> <span class="k">typeof</span> <span class="nx">b</span> <span class="o">==</span> <span class="s2">&#34;string&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;&#34;</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="s2">&#34; &#34;</span><span class="p">,</span> <span class="nx">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">a</span> <span class="o">==</span> <span class="s2">&#34;number&#34;</span> <span class="o">&amp;&amp;</span> <span class="k">typeof</span> <span class="nx">b</span> <span class="o">==</span> <span class="s2">&#34;number&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;&#34;</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nb">String</span><span class="p">(</span><span class="nx">a</span><span class="p">),</span> <span class="nb">String</span><span class="p">(</span><span class="nx">b</span><span class="p">)));</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">,</span> <span class="s2">&#34;world&#34;</span><span class="p">));</span> <span class="c1">// hello world
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span> <span class="c1">// 12
</span></span></span></code></pre></div><p>By simply the process of checking the type with <code>typeof a == &quot;string&quot;</code>, Typescript will infer that anything in the block will use <code>a</code> as a <code>string</code>. So, you can easily use <code>a.toUpperCase()</code> within the block but <code>a.toFixed(0)</code> will produce a compilation error.</p>
<p>In the above code block, you could drop the <code>else if</code> and include just an <code>else</code> to get the same result.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">join</span><span class="p">(</span><span class="nx">a</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">a</span> <span class="o">==</span> <span class="s2">&#34;string&#34;</span> <span class="o">&amp;&amp;</span> <span class="k">typeof</span> <span class="nx">b</span> <span class="o">==</span> <span class="s2">&#34;string&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;&#34;</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="s2">&#34; &#34;</span><span class="p">,</span> <span class="nx">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;&#34;</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nb">String</span><span class="p">(</span><span class="nx">a</span><span class="p">),</span> <span class="nb">String</span><span class="p">(</span><span class="nx">b</span><span class="p">)));</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">,</span> <span class="s2">&#34;world&#34;</span><span class="p">));</span> <span class="c1">// hello world
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">join</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span> <span class="c1">// 12
</span></span></span></code></pre></div><p>Typescript will understand that the only other type option for <code>a</code> and <code>b</code> is a <code>number</code>. So it will apply <code>number</code> properties and methods to the variables within the <code>else</code> block.</p>
<h3 id="instanceof">instanceof</h3>
<p>Similar to the use-case for variables described above, <code>instanceof</code> applies itself to user-defined classes and objects.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Earth</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;blue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Mars</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;red&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">colorPlanet</span><span class="p">(</span><span class="nx">planet</span><span class="o">:</span> <span class="nx">Earth</span> <span class="o">|</span> <span class="nx">Mars</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nx">planet</span> <span class="k">instanceof</span> <span class="nx">Earth</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">colorPlanet</span><span class="p">(</span><span class="k">new</span> <span class="nx">Earth</span><span class="p">());</span> <span class="c1">// blue
</span></span></span><span class="line"><span class="cl"><span class="nx">colorPlanet</span><span class="p">(</span><span class="k">new</span> <span class="nx">Mars</span><span class="p">());</span> <span class="c1">// red
</span></span></span></code></pre></div><h3 id="in">in</h3>
<p><code>in</code> is similar to <code>instanceof</code> but rather than using an instance of the class, we use a prop of the object to distinguish between two types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Earth</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">life</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;blue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Mars</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;red&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">processPlanet</span><span class="p">(</span><span class="nx">planet</span><span class="o">:</span> <span class="nx">Earth</span> <span class="o">|</span> <span class="nx">Mars</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="s2">&#34;life&#34;</span> <span class="k">in</span> <span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">processPlanet</span><span class="p">(</span><span class="k">new</span> <span class="nx">Earth</span><span class="p">());</span> <span class="c1">// blue
</span></span></span><span class="line"><span class="cl"><span class="nx">processPlanet</span><span class="p">(</span><span class="k">new</span> <span class="nx">Mars</span><span class="p">());</span> <span class="c1">// red
</span></span></span></code></pre></div><h3 id="literals">literals</h3>
<p>Literals just refer to literal values within an object and to use the possible options as typeguards.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">type</span> <span class="nx">custHappy</span> <span class="o">=</span> <span class="s2">&#34;yes&#34;</span> <span class="o">|</span> <span class="s2">&#34;no&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">loadSurvey</span><span class="p">(</span><span class="nx">sat</span><span class="o">:</span> <span class="nx">custHappy</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nx">sat</span> <span class="o">==</span> <span class="s2">&#34;yes&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;happy face&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// loadPublicSurvey();
</span></span></span><span class="line"><span class="cl">    <span class="c1">//upSellHell();
</span></span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;frown face&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// loadPrivateSurvey();
</span></span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Mix and match types in a Typescript function</title>
      <link>https://techformist.com/mix-match-types-typescript/</link>
      <pubDate>Sun, 22 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/mix-match-types-typescript/</guid>
      <description>&lt;p&gt;Typescript provides a convenient way to accept different types of arguments for a function, or to combine multiple types into one super type.&lt;/p&gt;
&lt;p&gt;Consider this example -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;printThis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;printThis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function is fine if we want to return the input string for some strange reason. But, what if we want to generalise that function to - say, numbers?&lt;/p&gt;
&lt;h3 id=&#34;union-type&#34;&gt;Union type&lt;/h3&gt;
&lt;p&gt;In Typescript we can simply specify the argument as being string or a number using what is called &amp;ldquo;union type&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Typescript provides a convenient way to accept different types of arguments for a function, or to combine multiple types into one super type.</p>
<p>Consider this example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">printThis</span><span class="p">(</span><span class="nx">a</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="k">typeof</span> <span class="nx">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">printThis</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">));</span> <span class="c1">// string
</span></span></span></code></pre></div><p>This function is fine if we want to return the input string for some strange reason. But, what if we want to generalise that function to - say, numbers?</p>
<h3 id="union-type">Union type</h3>
<p>In Typescript we can simply specify the argument as being string or a number using what is called &ldquo;union type&rdquo;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">printThis</span><span class="p">(</span><span class="nx">a</span><span class="o">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="k">typeof</span> <span class="nx">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">printThis</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">));</span> <span class="c1">// string
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">printThis</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span> <span class="c1">// number
</span></span></span></code></pre></div><p>The <code>|</code> specifies that the function accepts a string or a number. The function body has to handle any type-specific processing - here we are just returning the input and don&rsquo;t quite bother with that.</p>
<h3 id="intersection-type">Intersection type</h3>
<p>Complementing the &lsquo;union&rsquo; feature is what is called &ldquo;intersection type&rdquo;.</p>
<p>Intersection types allow us to combine multiple types in one and access any of the features of the individual types.</p>
<p>Consider a different example of two totally real-world classes -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Tomato</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="kr">public</span> <span class="nx">sweet</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Chilly</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="kr">public</span> <span class="nx">hot</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Since the classes are freaks of nature by themselves, we want to combine them and have the ability to make use of either properties or methods.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">combine</span><span class="o">&lt;</span><span class="nx">Tomato</span><span class="p">,</span> <span class="nx">Chilly</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">tom</span><span class="o">:</span> <span class="nx">Tomato</span><span class="p">,</span> <span class="nx">chill</span><span class="o">:</span> <span class="nx">Chilly</span><span class="p">)</span><span class="o">:</span> <span class="nx">Tomato</span> <span class="o">&amp;</span> <span class="nx">Chilly</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">mix</span><span class="o">:</span> <span class="nx">Partial</span><span class="o">&lt;</span><span class="nx">Tomato</span> <span class="o">&amp;</span> <span class="nx">Chilly</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">prop</span> <span class="k">in</span> <span class="nx">tom</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">tom</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">prop</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nx">mix</span> <span class="nx">as</span> <span class="nx">Tomato</span><span class="p">)[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">tom</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">prop</span> <span class="k">in</span> <span class="nx">chill</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">chill</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">prop</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nx">mix</span> <span class="nx">as</span> <span class="nx">Chilly</span><span class="p">)[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">chill</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">mix</span> <span class="nx">as</span> <span class="nx">Tomato</span> <span class="o">&amp;</span> <span class="nx">Chilly</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>By using a <code>Tomato &amp; Chilly</code> we are instructing Typescript that &ldquo;all types herein belongs to us&rdquo;. In the function, we are simply extracting props from both of the supplied objects and combining them into one object of one type.</p>
<p>We can use the function like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">tom</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Tomato</span><span class="p">(</span><span class="s2">&#34;sweet&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">chill</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Chilly</span><span class="p">(</span><span class="s2">&#34;hot&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">rightMix</span> <span class="o">=</span> <span class="nx">combine</span><span class="p">(</span><span class="nx">tom</span><span class="p">,</span> <span class="nx">chill</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">rightMix</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { sweet: &#39;sweet&#39;, hot: &#39;hot&#39; }
</span></span></span></code></pre></div><p>This is a rather simplistic example involving only props. In the real, real world we could use interfaces and also transfer all the goodness of member functions to the combined entity.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Function overloading for optional arguments in Typescript</title>
      <link>https://techformist.com/function-overloading-optional-arguments-typescript/</link>
      <pubDate>Sat, 21 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/function-overloading-optional-arguments-typescript/</guid>
      <description>&lt;p&gt;Overload functions to change signatures and provide optional arguments in Typescript.&lt;/p&gt;
&lt;p&gt;We have previously seen an option to &lt;a href=&#34;https://techformist.com/allow-additional-arguments-typescript&#34;&gt;provide optional arguments to a function in Typescript&lt;/a&gt;. But, there is more to that to function overloads.&lt;/p&gt;
&lt;p&gt;Building on our previous example -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the example, we have simply made &lt;code&gt;j&lt;/code&gt; and &lt;code&gt;k&lt;/code&gt; optional arguments and made their value &lt;code&gt;0&lt;/code&gt; if they are not provided. Although this is evident for someone who looks at the function definition, it is not so for a person looking at the declaration or the auto-complete when initializing this function.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Overload functions to change signatures and provide optional arguments in Typescript.</p>
<p>We have previously seen an option to <a href="/allow-additional-arguments-typescript">provide optional arguments to a function in Typescript</a>. But, there is more to that to function overloads.</p>
<p>Building on our previous example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">?:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">k</span><span class="o">?:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">j</span> <span class="o">=</span> <span class="nx">j</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">k</span> <span class="o">=</span> <span class="nx">k</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span> <span class="o">+</span> <span class="nx">k</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>In the example, we have simply made <code>j</code> and <code>k</code> optional arguments and made their value <code>0</code> if they are not provided. Although this is evident for someone who looks at the function definition, it is not so for a person looking at the declaration or the auto-complete when initializing this function.</p>
<p>Typescript provides a way to define function overloading during declaration so that we can make full use of the beautiful self-documenting feature.</p>
<p>Consider the same problem in the previous example written in a different way -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">k</span><span class="o">:</span> <span class="nx">number</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">?:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">k</span><span class="o">?:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">j</span> <span class="o">=</span> <span class="nx">j</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">k</span> <span class="o">=</span> <span class="nx">k</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span> <span class="o">+</span> <span class="nx">k</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span> <span class="c1">// 1
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span> <span class="c1">// 3
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">));</span> <span class="c1">// 6
</span></span></span></code></pre></div><p>While the last function is the one that actually gets executed, the developer who consumes this function sees a function with 3 options - provide <code>i</code> alone, <code>i</code> &amp; <code>j</code>, or all of <code>i</code>,<code>j</code> &amp; <code>k</code>.</p>
<p>Function overloading does not cause any runtime overhead, but it is invaluable to further the self-documenting goals of your project.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Duck typing in Typescript</title>
      <link>https://techformist.com/duck-typing-typescript/</link>
      <pubDate>Fri, 20 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/duck-typing-typescript/</guid>
      <description>&lt;p&gt;Let us discuss everyone&amp;rsquo;s favourite topic since Typescript was invented - &amp;lsquo;duck typing&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Duck typing is type safety checks for complex types. It gets its name following the adage -&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If it walks like a duck and quacks like a duck, it must be a duck.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Typescript modifies it slightly to -&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t check whether it is a duck. If it quacks like a duck.. etc., it must be a duck&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Consider an example with a couple of variables of type objects and derived from a class.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let us discuss everyone&rsquo;s favourite topic since Typescript was invented - &lsquo;duck typing&rsquo;.</p>
<p>Duck typing is type safety checks for complex types. It gets its name following the adage -</p>
<blockquote>
<p>If it walks like a duck and quacks like a duck, it must be a duck.</p>
</blockquote>
<p>Typescript modifies it slightly to -</p>
<blockquote>
<p>Don&rsquo;t check whether it is a duck. If it quacks like a duck.. etc., it must be a duck</p>
</blockquote>
<p>Consider an example with a couple of variables of type objects and derived from a class.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;round&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Plant</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;line&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">apple</span><span class="o">:</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">orange</span><span class="o">:</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">();</span>
</span></span></code></pre></div><p>In the past we have seen that objects are not set to the same rules as everyone else when it comes to specific operations. We cannot directly compare objects to get a valid result - they will be executed by reference rather than doing one-to-one comparison of object entries.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">apple</span> <span class="o">==</span> <span class="nx">orange</span><span class="p">);</span> <span class="c1">// false
</span></span></span></code></pre></div><p>Any type compatibility checks across objects (derived from same or different classes) will get complicated. But at the same time, we may not really worry about a class to derive the object from as long as the class has all of the properties of the object type.</p>
<p>Now, also mix this background of a problem with an additional complexity. Typescript strives to be compatible with non-typed objects within Typescript and variables from Javascript.</p>
<p>How would you ensure that a new object can interact in a type-safe way with a class and another object under these circumstances?</p>
<p>Enter &ldquo;duck typing&rdquo;.</p>
<p>With duck typing, Typescript compares signatures of classes and allows object of one type to be used with an instance of another if the object&rsquo;s type signature is same as, or is a subset of, the initiating class&rsquo;s signature.</p>
<p>Let&rsquo;s see examples!</p>
<p>The following initializations are valid since both <code>Fruit</code> and <code>Flower</code> have the same variable - <code>shape</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;round&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Flower</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;beautiful&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">apple</span><span class="o">:</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">daffodil</span><span class="o">:</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Flower</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">rose</span><span class="o">:</span> <span class="nx">Flower</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">();</span>
</span></span></code></pre></div><p>Let&rsquo;s add another class <code>Plant</code> with an additional variable.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;round&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Flower</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;beautiful&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Plant</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">shape</span> <span class="o">=</span> <span class="s2">&#34;straight line&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">allWeather</span> <span class="o">=</span> <span class="s2">&#34;false&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">orange</span><span class="o">:</span> <span class="nx">Fruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Plant</span><span class="p">();</span>
</span></span></code></pre></div><p>We see that all props of the type <code>Fruit</code> are available when we initialize <code>Plant</code>. So, this becomes a perfectly valid initialization.</p>
<p>However, we cannot do the opposite.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">egg</span><span class="o">:</span> <span class="nx">Plant</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2741: Property &#39;allWeather&#39; is missing in type &#39;Fruit&#39; but required in type &#39;Plant&#39;.
</span></span></span></code></pre></div><p><code>Plant</code> type has a variable called <code>allWeather</code>, which is not available with the initializing class <code>Fruit</code>. This causes a compile error.</p>
<h3 id="moral-of-the-story">Moral of the story</h3>
<p>Typescript does not care about the initializing class as long as it has all the props and methods of the class used for the type. So, keep calm and carry on typing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Allow more or less no. of arguments in Typescript functions</title>
      <link>https://techformist.com/allow-additional-arguments-typescript/</link>
      <pubDate>Thu, 19 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/allow-additional-arguments-typescript/</guid>
      <description>&lt;p&gt;Allow additional arguments or optional arguments for function calls in Typescript.&lt;/p&gt;
&lt;p&gt;Consider the below example of a function that adds two numbers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works fine and as expected, but what happens when there is a discrepancy in number of arguments.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// error TS2554: Expected 2 arguments, but got 1.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// An argument for &amp;#39;j&amp;#39; was not provided.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above error is perfect.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Allow additional arguments or optional arguments for function calls in Typescript.</p>
<p>Consider the below example of a function that adds two numbers.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>This works fine and as expected, but what happens when there is a discrepancy in number of arguments.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2554: Expected 2 arguments, but got 1.
</span></span></span><span class="line"><span class="cl"><span class="c1">// An argument for &#39;j&#39; was not provided.
</span></span></span></code></pre></div><p>The above error is perfect.</p>
<p>Except for the fact that Javascript does not behave this way. So, we can mess up functions, modules and classes when incrementally migrating them to Typescript.</p>
<h3 id="optional-arguments">Optional arguments</h3>
<p>Fortunately, Typescript has a work-around. You can make the last variable as optional.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">?:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// NaN
</span></span></span></code></pre></div><p>We did not get compilation errors, but runtime errors continue to happen.</p>
<p>And, you guessed it - there is a work-around for that too. We just revert to the our old friend - argument defaults.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><h3 id="additional-arguments">Additional arguments</h3>
<p>Additional arguments supplied to the function throws error similar to the previous cases but with a complaint and loud houl about providing more than necessary.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error TS2554: Expected 2 arguments, but got 3
</span></span></span></code></pre></div><p>We work-around the problem of additional parameters by taking some help from another old friend of the good guys - rest operator.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">j</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="p">...</span><span class="nx">k</span><span class="o">:</span> <span class="nx">number</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Public and Private Variables in Typescript</title>
      <link>https://techformist.com/public-private-variables-typescript/</link>
      <pubDate>Tue, 17 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/public-private-variables-typescript/</guid>
      <description>&lt;p&gt;Are public and private variables really public or private?&lt;/p&gt;
&lt;p&gt;Consider the below example -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;MathOp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;op&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;MathOp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;op&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// no problem
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you try to access the private variable..&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;op&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Error: Property &amp;#39;y&amp;#39; is private and only accessible within class &amp;#39;MathOp&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;what-does-private-even-mean&#34;&gt;What does &lt;code&gt;private&lt;/code&gt; even mean?&lt;/h3&gt;
&lt;p&gt;From our earlier definitions, the behaviour seems ok.&lt;/p&gt;
&lt;p&gt;Or, is it?&lt;/p&gt;
&lt;p&gt;Just compile the above code block to JS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tsc test1.ts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And, the compiled Javascript file is -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Are public and private variables really public or private?</p>
<p>Consider the below example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">public</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">op</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span> <span class="c1">// no problem
</span></span></span></code></pre></div><p>If you try to access the private variable..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">op</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Error: Property &#39;y&#39; is private and only accessible within class &#39;MathOp&#39;
</span></span></span></code></pre></div><h3 id="what-does-private-even-mean">What does <code>private</code> even mean?</h3>
<p>From our earlier definitions, the behaviour seems ok.</p>
<p>Or, is it?</p>
<p>Just compile the above code block to JS.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">tsc test1.ts
</span></span></code></pre></div><p>And, the compiled Javascript file is -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">MathOp</span> <span class="o">=</span> <span class="cm">/** @class */</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">function</span> <span class="nx">MathOp</span><span class="p">()</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">MathOp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">})();</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">op</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span> <span class="c1">// no problem
</span></span></span></code></pre></div><p>There is no mention of variables <code>x</code> and <code>y</code> in the class since they are just props. These props of the function can be dynamically defined and created.</p>
<p>There is nothing in the compiled Javascript that will have a problem running the script even if something is defined as <code>private</code>.</p>
<p>But, <code>private</code> does prevent successful compilation.</p>
<p>End result: we are pretty much covered with the private variables but be aware of compile and runtime differences in behaviour.</p>
<h3 id="public-can-be-dropped-from-the-statements"><code>public</code> can be dropped from the statements</h3>
<p>You can as well rewrite the Typescript file as -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">MathOp</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">op</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MathOp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">op</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span> <span class="c1">// no problem
</span></span></span></code></pre></div><p>Variables and methods are public by default - you can save on your typing a bit by dropping the <code>public</code> keyword altogether.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Different Types of Typescript</title>
      <link>https://techformist.com/types-in-typescript/</link>
      <pubDate>Mon, 16 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/types-in-typescript/</guid>
      <description>&lt;p&gt;With &amp;rsquo;type&amp;rsquo; in its name, Typescript lives up to its reputation of being a typed language. But, what exactly are the supported types?&lt;/p&gt;
&lt;p&gt;At a high-level we can classify types as built-in (basic &amp;amp; special ) and additional types including user-defined types.&lt;/p&gt;
&lt;h3 id=&#34;built-in-types-basic&#34;&gt;Built-in Types (Basic)&lt;/h3&gt;
&lt;p&gt;Similar to Javascript implicit types, we have &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt; to form the three core built-in types.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;earth&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;isHappy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We also have &lt;code&gt;null&lt;/code&gt;, and &lt;code&gt;undefined&lt;/code&gt; as additional basic built-in types.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>With &rsquo;type&rsquo; in its name, Typescript lives up to its reputation of being a typed language. But, what exactly are the supported types?</p>
<p>At a high-level we can classify types as built-in (basic &amp; special ) and additional types including user-defined types.</p>
<h3 id="built-in-types-basic">Built-in Types (Basic)</h3>
<p>Similar to Javascript implicit types, we have <code>number</code>, <code>string</code>, <code>boolean</code> to form the three core built-in types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">num</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">planet</span><span class="o">:</span> <span class="nx">string</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">isHappy</span><span class="o">:</span> <span class="kr">boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span></code></pre></div><p>We also have <code>null</code>, and <code>undefined</code> as additional basic built-in types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">nothing</span><span class="o">:</span> <span class="kc">null</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">undef</span><span class="o">:</span> <span class="kc">undefined</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</span></span></code></pre></div><p>You could technically do this..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fruit</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">flower</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// we&#39;ll deal with any in a bit
</span></span></span></code></pre></div><p>.. and also this (when a flag called <code>--strictNullChecks</code> is not specified during compilation) -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fruit</span><span class="o">:</span> <span class="nx">string</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">num</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</span></span></code></pre></div><p>Oh, and symbol is also a valid type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">sup</span><span class="o">:</span> <span class="nx">symbol</span><span class="p">;</span>
</span></span></code></pre></div><h3 id="built-in-types-special">Built-in Types (Special)</h3>
<p>There are four types that have special function within Typescript.</p>
<h5 id="any">any</h5>
<p><code>any</code> represents any type. It gives super powers to Typescript and makes it play well with Javascript. <code>any</code> tells Typescript to do a type inference on a variable.</p>
<p>For e.g. ,</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fruit</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="s2">&#34;apple&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// or simply, const fruit = &#34;apple&#34;
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">fruit</span><span class="p">);</span> <span class="c1">// string
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">num</span><span class="o">:</span> <span class="nx">any</span> <span class="o">=</span> <span class="mi">123</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">num</span><span class="p">);</span> <span class="c1">// number
</span></span></span></code></pre></div><p><code>any</code> can be your best friend. You can convert your entire Javascript to Typescript by simply changing extension and continue using it as before. You could then incrementally add Typescript powers to the script.</p>
<p>Since any variable without a type is assumed as type <code>any</code>, Typescript can also interact Javascript without a hitch.</p>
<h5 id="unknown">unknown</h5>
<p><code>unknown</code> was introduced in Typescript v3. It is type safe <code>any</code> - a variable with type <code>unknown</code> can be assigned value of any type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">unknown</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">x</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// number
</span></span></span></code></pre></div><p>But, <code>unknown</code> cannot be assigned to any other type other than <code>unknown</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">unknown</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="nx">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Error: Type &#39;unknown&#39; is not assignable to type &#39;number&#39;.
</span></span></span></code></pre></div><p>.. and, no operations are allowed for unknown data type against a known type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Error: Operator &#39;+&#39; cannot be applied to types &#39;unknown&#39; and &#39;1&#39;.
</span></span></span></code></pre></div><h5 id="void">void</h5>
<p>As you expect, <code>void</code> has its duty cut out with functions - it primarily means no type.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">printThis</span><span class="p">(</span><span class="nx">msg</span><span class="p">)</span><span class="o">:</span> <span class="k">void</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">msg</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">printThis</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p><code>void</code> can also be used against mere variables, but you would have to answer to yourself whether you are addressing a galaxy-level problem doing that. These variables are not assignable to valid values thereon.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">a</span><span class="o">:</span> <span class="k">void</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// the above will throw compile error when --strictNullChecks flag is used
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">b</span><span class="o">:</span> <span class="k">void</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ok, but to what effect?
</span></span></span></code></pre></div><h5 id="never">never</h5>
<p><code>never</code> signifies values that never occur. That can be confusing if you&rsquo;re not into quantum mechanics, but let me explain.</p>
<p>Consider a function that always throws error - it does not need to return anything.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">thrower</span><span class="o">:</span><span class="nx">never</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="k">throw</span> <span class="s2">&#34;I throw stuff&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>So, how can it distinguish itself from <code>void</code>?</p>
<p><code>void</code> is for functions where you can reach the end of function. While <code>never</code> is for functions where end of function is never reached.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">whatAManWants</span><span class="o">:</span><span class="nx">never</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">gobble</span><span class="p">(</span><span class="nx">resources</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="additional-types">Additional Types</h3>
<p>&lsquo;Additional type&rsquo; is just a bucket to include all the other types other than the primitive types defined above. Typescript supports other types including user-defined types like those described below.</p>
<h5 id="collections">Collections</h5>
<p>Collections can include arrays and tuples. Each of those collections can have elements with a specific type or a mix of types using <code>any</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fruits</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;apple&#34;</span><span class="p">,</span> <span class="s2">&#34;orange&#34;</span><span class="p">,</span> <span class="s2">&#34;pear&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">primes</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">number</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// any
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">universe</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">any</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;life&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">universe</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [ &#39;life&#39;, 42 ]
</span></span></span></code></pre></div><p>A tuple with fixed number of elements has those elements with specific types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">everything</span><span class="o">:</span> <span class="p">[</span><span class="nx">string</span><span class="p">,</span> <span class="nx">number</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="nx">everything</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;life&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">everything</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [ &#39;life&#39;, 42 ]
</span></span></span></code></pre></div><h5 id="special-data-type-enum">Special data type: <code>enum</code></h5>
<p><code>enum</code> is not like anything that you have seen so far.</p>
<ol>
<li>you define <code>enum</code></li>
<li>a variable of the defined <code>enum</code> type can be assigned to a value within the <code>enum</code></li>
</ol>
<p>Consider the below example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">enum</span> <span class="nx">Planets</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">mercury</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">venus</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">earth</span> <span class="o">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earthPos</span><span class="o">:</span> <span class="nx">Planets</span> <span class="o">=</span> <span class="nx">Planets</span><span class="p">.</span><span class="nx">earth</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;earthPos: &#34;</span><span class="p">,</span> <span class="nx">earthPos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><h5 id="object">Object</h5>
<p>As in Javascript, anything that is not primitive is an object.</p>
<p>The following code is valid..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">apple</span><span class="o">:</span> <span class="nb">Object</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;apple&#34;</span><span class="p">,</span> <span class="nx">color</span><span class="o">:</span> <span class="s2">&#34;red&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">apple</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;apple&#39;, color: &#39;red&#39; }
</span></span></span></code></pre></div><p>But, depending on your situation, may not be useful for type assertion against the object&rsquo;s props (like <code>Array&lt;string&gt;</code> for example).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Classes, Objects, Props and Interfaces in Typescript</title>
      <link>https://techformist.com/class-object-interface-typescript/</link>
      <pubDate>Fri, 13 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/class-object-interface-typescript/</guid>
      <description>&lt;p&gt;Get started with object oriented programming in Typescript.&lt;/p&gt;
&lt;p&gt;Typescript behaves like a language with built-in support for OOP concepts, and does not carry the quirks of Javascript in that respect.&lt;/p&gt;
&lt;h3 id=&#34;classes-and-objects&#34;&gt;Classes and Objects&lt;/h3&gt;
&lt;p&gt;Define classes and objects like how you define in any of the popular OOP languages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Fruit&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;grownIn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;constructor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;grownIn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;grownIn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;grownIn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;getGrownIn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;role&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;role&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;grownIn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;appleFruit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Fruit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;India&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;China&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;appleFruit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// apple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We have defined a simple class &amp;lsquo;Fruit&amp;rsquo; and provided it with -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Get started with object oriented programming in Typescript.</p>
<p>Typescript behaves like a language with built-in support for OOP concepts, and does not carry the quirks of Javascript in that respect.</p>
<h3 id="classes-and-objects">Classes and Objects</h3>
<p>Define classes and objects like how you define in any of the popular OOP languages.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">public</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="nx">grownIn</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">grownIn</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">this</span><span class="p">.</span><span class="nx">grownIn</span> <span class="o">=</span> <span class="nx">grownIn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">getGrownIn</span><span class="p">(</span><span class="nx">role</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">role</span> <span class="o">==</span> <span class="s2">&#34;admin&#34;</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">grownIn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">return</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">private</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">appleFruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">(</span><span class="s2">&#34;apple&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;India&#34;</span><span class="p">,</span> <span class="s2">&#34;China&#34;</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">appleFruit</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// apple
</span></span></span></code></pre></div><p>We have defined a simple class &lsquo;Fruit&rsquo; and provided it with -</p>
<ul>
<li>a public variable of type string - <code>name</code></li>
<li>a private variable of type array of strings - <code>grownIn</code></li>
<li>constructor to set variable values from initialization</li>
<li>method to get value of <code>getGrownIn</code></li>
</ul>
<p>We define <code>appleFruit</code> as an object of the class <code>Fruit</code> and initialize it with values for both <code>name</code> and <code>grownIn</code>.</p>
<p>Straight off the bat we see the feature of private variables, which are a thing only in the most recent Javascript standard.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">appleFruit</span><span class="p">.</span><span class="nx">grownIn</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Error: Property &#39;grownIn&#39; is private and only accessible within class &#39;Fruit&#39;.
</span></span></span></code></pre></div><p>We also see how auto-complete works beautifully while typing in all this code.</p>
<h3 id="use-interfaces">Use interfaces</h3>
<p>We can level-up the above code by using interfaces for additional abstraction.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">Plant</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">plant</span><span class="o">?:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">type</span><span class="o">?:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We have specified two variables and both are optional.</p>
<p>Change the class to implement this interface.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="kr">implements</span> <span class="nx">Plant</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">public</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">private</span> <span class="nx">grownIn</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">constructor</span><span class="p">(</span><span class="nx">name</span><span class="o">:</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">grownIn</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span><span class="p">,</span> <span class="kr">public</span> <span class="nx">plant</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">this</span><span class="p">.</span><span class="nx">grownIn</span> <span class="o">=</span> <span class="nx">grownIn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">getGrownIn</span><span class="p">(</span><span class="nx">role</span><span class="o">:</span> <span class="nx">string</span><span class="p">)</span><span class="o">:</span> <span class="nb">Array</span><span class="o">&lt;</span><span class="nx">string</span><span class="o">&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">role</span> <span class="o">==</span> <span class="s2">&#34;admin&#34;</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">grownIn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">return</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">appleFruit</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Fruit</span><span class="p">(</span><span class="s2">&#34;apple&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;India&#34;</span><span class="p">,</span> <span class="s2">&#34;China&#34;</span><span class="p">],</span> <span class="s2">&#34;Apple Tree&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">appleFruit</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span></span></code></pre></div><p>Similar to other languages you can extend a parent class in the interface.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">PlantMatters</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">Plant</span> <span class="kr">extends</span> <span class="nx">PlantMatters</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>What is Typescript and why should I care?</title>
      <link>https://techformist.com/what-typescript/</link>
      <pubDate>Thu, 12 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/what-typescript/</guid>
      <description>&lt;p&gt;I had been fascinated by Typescript and have been going back and forth on making it my primary programming language. In a few posts and with as much less information as possible, let&amp;rsquo;s see why anyone should bother with Typescript.&lt;/p&gt;
&lt;h3 id=&#34;what-is-typescript&#34;&gt;What is Typescript?&lt;/h3&gt;
&lt;p&gt;Typescript is a typed Javascript.&lt;/p&gt;
&lt;p&gt;No, I am kidding - it is more than that. &lt;a href=&#34;https://www.typescriptlang.org&#34;&gt;Typescript&lt;/a&gt; is not only strongly typed language that acts as a super-set of Javascript, but also is compiled and object oriented language. What distinguishes Typescript is not the language alone but the tooling that surrounds the language.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I had been fascinated by Typescript and have been going back and forth on making it my primary programming language. In a few posts and with as much less information as possible, let&rsquo;s see why anyone should bother with Typescript.</p>
<h3 id="what-is-typescript">What is Typescript?</h3>
<p>Typescript is a typed Javascript.</p>
<p>No, I am kidding - it is more than that. <a href="https://www.typescriptlang.org">Typescript</a> is not only strongly typed language that acts as a super-set of Javascript, but also is compiled and object oriented language. What distinguishes Typescript is not the language alone but the tooling that surrounds the language.</p>
<p>Typescript was invented and popularised by the good folks at Microsoft. It is in active development and continues to add amazing features with each release.</p>
<p>The Typescript ecosystem makes you welcome as a Javascript developer, does not impose itself but gives you really powerful tools if you want dive right in. Your development is going to be more standardized, faster, and your code is going to be friendly with everyone in the team.</p>
<p>I see a great value for Typescript in a team setting or for components and libraries that are used by everyone and their dogs.</p>
<h3 id="why-another-language">Why another language?</h3>
<p>You should use Typescript because it is and is not another language at the same time.</p>
<p>Strong typing may seem daunting at first but the amount of errors it catches by itself and the ease of development(?) more than makes up for the initial hiccups and the extra typing.</p>
<p>There are of course a host of features that make Typescript invaluable and my objective here is not to cover them all. Key features include -</p>
<ul>
<li>Compiled language - catch more errors at compile and not at runtime</li>
<li>Good support for object oriented features (at least during development / compilation)</li>
<li>Runs seamlessly across environments - web, operating systems and devices</li>
<li>Typing everything can be the most beautiful form of self-documenting everything</li>
<li>Easier to code!</li>
</ul>
<h3 id="but-i-am-a-javascript-fanatic">But, I am a Javascript fanatic</h3>
<p>Typescript is not a new language housed in an island and its own ecosystem. It coexists with Javascript.</p>
<ul>
<li>Typescript is Javascript++. Typescript gets compiled to Javascript for execution when required</li>
<li>You can use both Javascript and other Typescript libraries within Typescript. You can use Typescript libraries within Javascript too</li>
<li>Migrations can be incremental. You can use inferred typing and get started on Typescript with existing code</li>
</ul>
<h3 id="get-started">Get started</h3>
<p>Getting started with Typescript is easy. Let us setup the development environment first.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm install -g typescript
</span></span></code></pre></div><p>Then, create a new file &ldquo;hello.ts&rdquo;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// hello.ts
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>If you now do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">tsc hello.ts
</span></span></code></pre></div><p>.. you will get a <code>hello.js</code> file. This is a JS compiled version from your Typescript file.</p>
<p>Since we did not quite use any Typescript specific stuff, our JS file is same as TS file.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>You can run the JS file to the same end result as a normal JS file.</p>
<p>Alternatively, you can create the TS file and simply execute two commands in one go -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">tsc class1.ts <span class="p">|</span> node class1.js
</span></span></code></pre></div><p>Or, use a better utility built to the purpose.</p>
<p>Install <code>ts-node</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm i -g ts-node
</span></span></code></pre></div><p>Now, you can use <code>nodemon</code> to watch for changes in your Typescript file, generate Javascript when required and execute the Javascript - in one seamless way.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">nodemon hello.ts
</span></span></code></pre></div><p>We do not see the intermittent file &ldquo;hello.js&rdquo; using this method but it is recommended for development purposes only.</p>
<h3 id="write-a-better-typescript-example">Write a better typescript example</h3>
<p>Create a new file <code>sum.ts</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">x</span><span class="o">:</span> <span class="nx">number</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="nx">number</span><span class="p">)</span><span class="o">:</span> <span class="nx">number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>You may observe that when you type <code>getSum(</code>, the autocomplete will suggest the type or arguments and the return. This auto-suggestion does not seem all that important, but is super useful when you are working in teams or have to work with third party libraries.</p>
<p>Next, try to do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span><span class="o">:</span> <span class="nx">number</span> <span class="o">=</span> <span class="nx">getSum</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// TSError: ⨯ Unable to compile TypeScript:
</span></span></span><span class="line"><span class="cl"><span class="c1">// class1.ts:5:28 - error TS2345: Argument of type &#39;&#34;a&#34;&#39; is not assignable to parameter of type &#39;number&#39;
</span></span></span></code></pre></div><p>You see a couple of significant things -</p>
<ol>
<li>Editors like VSCode catch the error - no compilation or execution required. The &lsquo;a&rsquo; argument is underlined with red squiggly in the hope that you correct the error</li>
<li>Even if you ignore the editor error, Typescript does not compile the file but throws the error outlined above</li>
</ol>
<h3 id="also-see">Also see</h3>
<ul>
<li><a href="https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html">Typescript in 5 minutes</a>.</li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
