<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Eric Ladage</title>
        <link>undefined</link>
        <description>Your blog description</description>
        <lastBuildDate>Thu, 24 Sep 2026 20:15:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Eric Ladage</title>
            <url>undefined/favicon.ico</url>
            <link>undefined</link>
        </image>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[Typescript Generics]]></title>
            <link>undefined/blog/typescript-generics</link>
            <guid>undefined/blog/typescript-generics</guid>
            <pubDate>Wed, 17 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[What are generics in typescript and how can they be used to make your code more flexible and reusable?]]></description>
            <content:encoded><![CDATA[<pre class="language-ts"><code class="language-ts"><span class="token keyword">function</span> <span class="token generic-function"><span class="token function">explain</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token maybe-class-name">WhatTheFuckIsThis</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>arg<span class="token operator">:</span> <span class="token maybe-class-name">WhatTheFuckIsThis</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token maybe-class-name">WhatTheFuckIsThis</span> <span class="token punctuation">{</span>
  <span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">This is a </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>arg<span class="token punctuation">.</span><span class="token property-access">constructor</span><span class="token punctuation">.</span><span class="token property-access">name</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword control-flow">return</span> arg<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">// ✅</span>
<span class="token keyword">let</span> num <span class="token operator">=</span> <span class="token generic-function"><span class="token function">explain</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">number</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Logs: Number</span>
<span class="token keyword">let</span> str <span class="token operator">=</span> <span class="token generic-function"><span class="token function">explain</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token string">&#x27;123&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Logs: String</span>

<span class="token comment">// ❌</span>
<span class="token keyword">let</span> badNum <span class="token operator">=</span> <span class="token generic-function"><span class="token function">explain</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">number</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token string">&#x27;123&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Argument of type &#x27;string&#x27; is not assignable to parameter of type &#x27;number&#x27;.</span>
<span class="token keyword">let</span> badStr <span class="token operator">=</span> <span class="token generic-function"><span class="token function">explain</span><span class="token generic class-name"><span class="token operator">&lt;</span>str<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Argument of type &#x27;number&#x27; is not assignable to parameter of type &#x27;string&#x27;.</span>
</code></pre>
<p>So what exactly does the parameter in brackets after the function name mean? It&#x27;s called a generic type parameter, and it allows us to write functions that can work with different types of data while still maintaining type safety.</p>
<h2>What Are TypeScript Generics?</h2>
<p>In TypeScript, generics are a way to create reusable components that can work with a variety of data types while still maintaining type safety. Imagine them as placeholders for any type. They allow developers to write flexible functions, classes, or interfaces that can handle different types of arguments while preserving the benefits of type checking.</p>
<p>A generic function might look something like this:</p>
<pre class="language-ts"><code class="language-ts"><span class="token keyword">function</span> <span class="token generic-function"><span class="token function">identity</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token constant">T</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>arg<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> arg<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>In this example, <code>T</code> is a type variable — a stand-in for any type. The <code>&lt;T&gt;</code> right after the function name declares a generic function. This function can work with any type <code>T</code>. The <code>(arg: T): T</code> means that this function takes one argument, arg, of type <code>T</code> and returns a value of the same type <code>T</code>.</p>
<h2>Why Are Generics Useful?</h2>
<p>TypeScript is a statically typed superset of JavaScript, meaning it adds static types to the JavaScript language. This feature allows the compiler to check types before the code runs, which can help catch errors early.</p>
<p>However, JavaScript is inherently a dynamically typed language, and sometimes, we need our TypeScript code to maintain some of that flexibility. This is where generics shine.</p>
<p>Generics allow developers to write flexible and reusable code while preserving the benefits of type safety. You can use generics to create functions, classes, and interfaces that can work with different data types without losing the benefits of the compiler&#x27;s type checks.</p>
<h2>When Are Generics Useful?</h2>
<p>Generics are particularly useful when you need a function, class, or interface to work with different data types while still maintaining type safety.</p>
<p>For example, consider an array in JavaScript, which can contain elements of any type. If you&#x27;re writing a TypeScript function that operates on an array, you could use generics to ensure that the function works with arrays of any type while still benefiting from TypeScript&#x27;s type checks.</p>
<p>Here&#x27;s some maybe more practical examples:</p>
<pre class="language-ts"><code class="language-ts"><span class="token keyword">function</span> <span class="token generic-function"><span class="token function">getLastItem</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token constant">T</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>arr<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> arr<span class="token punctuation">[</span>arr<span class="token punctuation">.</span><span class="token property-access">length</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">let</span> numArr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> strArr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">&#x27;Apple&#x27;</span><span class="token punctuation">,</span> <span class="token string">&#x27;Banana&#x27;</span><span class="token punctuation">,</span> <span class="token string">&#x27;Cherry&#x27;</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token function">getLastItem</span><span class="token punctuation">(</span>numArr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs: 5</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token function">getLastItem</span><span class="token punctuation">(</span>strArr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs: &#x27;Cherry&#x27;</span>
</code></pre>
<pre class="language-ts"><code class="language-ts"><span class="token keyword">function</span> <span class="token generic-function"><span class="token function">getLastItem</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token constant">T</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>arr<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token constant">T</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> arr<span class="token punctuation">[</span>arr<span class="token punctuation">.</span><span class="token property-access">length</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">let</span> numArr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> strArr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">&#x27;Apple&#x27;</span><span class="token punctuation">,</span> <span class="token string">&#x27;Banana&#x27;</span><span class="token punctuation">,</span> <span class="token string">&#x27;Cherry&#x27;</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">getLastItem</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>numArr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs: 5</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">getLastItem</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span>strArr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs: &#x27;Cherry&#x27;</span>
</code></pre>
<p>In this example, getLastItem is a generic function that can work with arrays of any type. The type T is replaced with the actual type of the array when the function is called, and TypeScript enforces that the return type matches the type of the array&#x27;s elements.</p>
<h2>Conclusion</h2>
<p>Generics are a powerful feature in TypeScript that allow you to write reusable, flexible, and type-safe code. They are an essential tool in any TypeScript developer&#x27;s toolkit. By understanding and utilizing generics, you can greatly improve the robustness and maintainability of your TypeScript code.</p>]]></content:encoded>
            <author>eladage@gmail.com (Eric Ladage)</author>
        </item>
        <item>
            <title><![CDATA[Proposal For Typescript]]></title>
            <link>undefined/blog/typescript-proposal</link>
            <guid>undefined/blog/typescript-proposal</guid>
            <pubDate>Tue, 16 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Simple proposal I wrote to convince my team to make the switch to typescript in our codebase.]]></description>
            <content:encoded><![CDATA[<h2>What is typescript?</h2>
<p>Typescript is essentially an added typing layer to vanilla Javascript. As we know, JavaScript is a popular programming language that is widely used for web development. However, as applications grow in complexity and size, the limitations of JavaScript become more apparent. TypeScript adds optional type annotations and other features that make it easier to write and maintain large-scale applications.</p>
<h2>Benefits of TypeScript</h2>
<p>Type annotations and type checking: One of the main benefits of TypeScript is its support for optional type annotations. This allows developers to specify the expected data types of variables, function parameters, and return values. TypeScript&#x27;s type checker then uses this information to catch type-related errors at compile time, rather than at runtime. This can help prevent a class of bugs and make the development process more efficient.</p>
<p>Improved code maintainability and readability: With TypeScript&#x27;s optional type annotations, it&#x27;s much easier to understand what a function or variable is supposed to do, which can greatly improve code maintainability and readability. Additionally, TypeScript provides better IntelliSense and auto-completion support, which makes it easier to navigate large codebases.</p>
<p>Better tooling support: TypeScript has better tooling support than JavaScript. Many popular IDEs and text editors have built-in support for TypeScript, which can make the development experience more seamless. Additionally, TypeScript is compatible with many popular libraries and frameworks, such as React and Angular, which means developers can use TypeScript with their existing toolset.</p>
<p>Improved scalability: TypeScript&#x27;s type annotations and improved tooling support make it a better choice for building large-scale applications. The type annotations provide a way to catch errors early in the development process, while the improved tooling support makes it easier to navigate and maintain large codebases.</p>
<p>Strong OOP Support: TypeScript offers features like class, interfaces, and private members, which makes it more suitable for Object-oriented development (This point is more focused on backend code, where ts would also be beneficial).</p>
<h2>Code Examples</h2>
<p>I&#x27;ll just take a small component in the existing navigator code base and rewrite it using typescript:</p>
<pre class="language-jsx"><code class="language-jsx"><span class="token comment">// original file in javascript</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">React</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;react&#x27;</span>
<span class="token keyword module">import</span> <span class="token punctuation">{</span> <span class="token known-class-name class-name">Error</span> <span class="token punctuation">}</span> <span class="token keyword module">from</span> <span class="token string">&#x27;@progress/kendo-react-labels&#x27;</span>

<span class="token keyword">const</span> <span class="token function-variable function"><span class="token maybe-class-name">FilterMessages</span></span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">props</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">{</span> messages<span class="token punctuation">,</span> fieldkey<span class="token punctuation">,</span> innerId <span class="token punctuation">}</span> <span class="token operator">=</span> props<span class="token punctuation">;</span>

  <span class="token keyword">const</span> filteredMessages <span class="token operator">=</span> messages<span class="token punctuation">.</span><span class="token method function property-access">filter</span><span class="token punctuation">(</span>
    <span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> message<span class="token punctuation">.</span><span class="token property-access">field</span> <span class="token operator">===</span> fieldkey<span class="token punctuation">;</span>
  <span class="token punctuation">)</span>

  <span class="token keyword">let</span> content <span class="token operator">=</span> <span class="token keyword null nil">null</span><span class="token punctuation">;</span>
  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>filteredMessages<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>innerId<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      content <span class="token operator">=</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Error</span></span> <span class="token attr-name">id</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>innerId<span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>filteredMessages<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token property-access">message</span><span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">Error</span></span><span class="token punctuation">&gt;</span></span>
    <span class="token punctuation">}</span> <span class="token keyword control-flow">else</span> <span class="token punctuation">{</span>
      content <span class="token operator">=</span> <span class="token punctuation">(</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
          </span><span class="token punctuation">{</span>filteredMessages<span class="token punctuation">.</span><span class="token method function property-access">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token punctuation">(</span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span> <span class="token attr-name">key</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>message<span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>message<span class="token punctuation">.</span><span class="token property-access">message</span><span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">&gt;</span></span>
          <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token plain-text">
        </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">&gt;</span></span>
      <span class="token punctuation">)</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
  <span class="token keyword control-flow">return</span> content<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// same file rewritten with types</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">React</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;react&#x27;</span><span class="token punctuation">;</span>
<span class="token keyword module">import</span> <span class="token punctuation">{</span> <span class="token known-class-name class-name">Error</span> <span class="token punctuation">}</span> <span class="token keyword module">from</span> <span class="token string">&#x27;@progress/kendo-react-labels&#x27;</span><span class="token punctuation">;</span>

<span class="token keyword">type</span> <span class="token class-name"><span class="token maybe-class-name">Message</span></span> <span class="token operator">=</span> <span class="token punctuation">{</span>
  id<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span>
  field<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
  message<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">interface</span> <span class="token class-name"><span class="token maybe-class-name">FilterMessagesProps</span></span> <span class="token punctuation">{</span>
  messages<span class="token operator">:</span> <span class="token maybe-class-name">Message</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  fieldKey<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
  innerId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">FilterMessages</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  messages<span class="token punctuation">,</span>
  fieldKey<span class="token punctuation">,</span>
  innerId<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token operator">:</span> <span class="token maybe-class-name">FilterMessagesProps</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token constant">JSX</span><span class="token punctuation">.</span><span class="token property-access"><span class="token maybe-class-name">Element</span></span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> filteredMessages<span class="token operator">:</span> <span class="token maybe-class-name">Message</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> messages<span class="token punctuation">.</span><span class="token method function property-access">filter</span><span class="token punctuation">(</span>
    <span class="token punctuation">(</span>message<span class="token operator">:</span> <span class="token maybe-class-name">Message</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> message<span class="token punctuation">.</span><span class="token property-access">field</span> <span class="token operator">===</span> fieldKey<span class="token punctuation">,</span>
  <span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>filteredMessages<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">return</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>innerId<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Error</span></span> <span class="token attr-name">id</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>innerId<span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>filteredMessages<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token property-access">message</span><span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">Error</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token punctuation">{</span>filteredMessages<span class="token punctuation">.</span><span class="token method function property-access">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span>message<span class="token operator">:</span> <span class="token maybe-class-name">Message</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token punctuation">(</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span> <span class="token attr-name">key</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>message<span class="token punctuation">.</span><span class="token property-access">id</span><span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>message<span class="token punctuation">.</span><span class="token property-access">message</span><span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">&gt;</span></span>
      <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">&gt;</span></span>
  <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>You can see in the rewrite that I have created an interface for the React component which will self-document what we expect to receive as props and above that I have created a <code>Message</code> type which tells us what we expect every element of the <code>messages</code> array to contain.</p>
<p>This is useful because it immediately will show you what a <code>message</code> contains. Take this image from my IDE as an example:</p>
<p><img src="https://user-images.githubusercontent.com/121046841/211629330-9df986fc-f230-4c6b-93ff-9eb8bc685e55.png" alt="Image"/></p>
<p>Once you start to write the code, vscode will pop up with what it already knows <code>message</code> can contain. This eliminates typos which in turn removes a high percentage of bugs that make it to shipped code.</p>
<p>Rewriting this in typescript also immediately found an error in the code. The original code has the following HTML element:</p>
<pre class="language-jsx"><code class="language-jsx"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span> <span class="token attr-name">key</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>message<span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">message.message}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">&gt;</span></span>
</code></pre>
<p>We can see that <code>message</code> is trying to be used as a key for the <code>&lt;li /&gt;</code> element which is invalid as <code>message</code> is an <code>object</code> not a <code>string</code> or <code>number</code>.</p>
<p>With typescript the IDE flags this as an error and gives a helpful message:</p>
<p><img src="https://user-images.githubusercontent.com/121046841/211632184-26080765-bf34-4fab-b116-172fccdab120.png" alt="Image"/></p>
<p>Now if you go to consume this component you will get useful autocomplete and errors if the props do not match the typing that we&#x27;ve set up.</p>
<p><a href="https://user-images.githubusercontent.com/121046841/211636315-0510ad29-96ea-4364-b396-797ffa09ab47.mp4">Demo</a></p>
<h2>Conclusion</h2>
<p>For any frontend web projects being started fresh I don&#x27;t think there are any drawbacks to leveraging typescript and there are a ton of benefits with little to no learning curve for new devs as they can take or leave the typing syntax as they begin to learn it. It will eliminate bugs in production and make code much cleaner while giving devs useful quality of life improvements.</p>]]></content:encoded>
            <author>eladage@gmail.com (Eric Ladage)</author>
        </item>
        <item>
            <title><![CDATA[Placeholder Post with IMAGES]]></title>
            <link>undefined/blog/placeholder-with-extras</link>
            <guid>undefined/blog/placeholder-with-extras</guid>
            <pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Lorem ipsum whatever man]]></description>
            <content:encoded><![CDATA[<p>This is where some cool post with like images and whatever would be...</p>
<img alt="" loading="lazy" width="498" height="373" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fif-i-had-one.dc039fb9.gif&amp;w=640&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fif-i-had-one.dc039fb9.gif&amp;w=1080&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fif-i-had-one.dc039fb9.gif&amp;w=1080&amp;q=75"/>
<h2>Sermone fata</h2>
<p>Lorem markdownum, bracchia in redibam! Terque unda puppi nec, linguae posterior
in utraque respicere candidus Mimasque formae; quae conantem cervice. Parcite
variatus, redolentia adeunt. Tyrioque dies, naufraga sua adit partibus celanda
torquere temptata, erit maneat et ramos, <a href="#">iam</a> ait dominari
potitus! Tibi litora matremque fumantia condi radicibus opusque.</p>
<p>Deus feram verumque, fecit, ira tamen, terras per alienae victum. Mutantur
levitate quas ubi arcum ripas oculos abest. Adest <a href="#">commissaque
victae</a> in gemitus nectareis ire diva
dotibus ora, et findi huic invenit; fatis? Fractaque dare superinposita
nimiumque simulatoremque sanguine, at voce aestibus diu! Quid veterum hausit tu
nil utinam paternos ima, commentaque.</p>]]></content:encoded>
            <author>eladage@gmail.com (Eric Ladage)</author>
        </item>
    </channel>
</rss>