<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arnaud Leymet</title>
    <description>The latest articles on DEV Community by Arnaud Leymet (@prod).</description>
    <link>https://dev.to/prod</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F637522%2F72cf359f-c110-46c0-a5a9-719cf0e2d506.jpg</url>
      <title>DEV Community: Arnaud Leymet</title>
      <link>https://dev.to/prod</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prod"/>
    <language>en</language>
    <item>
      <title>Building an App 📱 and its Stack in minutes with LOLstack 🥡</title>
      <dc:creator>Arnaud Leymet</dc:creator>
      <pubDate>Sat, 07 Aug 2021 22:10:51 +0000</pubDate>
      <link>https://dev.to/codename/building-an-app-and-its-stack-in-minutes-with-lolstack-gka</link>
      <guid>https://dev.to/codename/building-an-app-and-its-stack-in-minutes-with-lolstack-gka</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hello there (ʘ‿ʘ)╯&lt;/strong&gt;&lt;br&gt;
This post is part of a short series you may prefer to read chronologically.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Preface
&lt;/h2&gt;

&lt;p&gt;Chosing what will compose a stack is both a matter of &lt;em&gt;experience&lt;/em&gt;, &lt;em&gt;opinion&lt;/em&gt; and &lt;em&gt;timing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Experience&lt;/em&gt; helps identifying what will stick, but &lt;em&gt;opinion&lt;/em&gt; has a major role in the final chosing.&lt;/p&gt;

&lt;p&gt;As of &lt;em&gt;timing&lt;/em&gt;, what seems to be a good idea at the time, may be compromised by a lack of maintainers goodwill or vision a year later.&lt;/p&gt;

&lt;p&gt;So by no means is the &lt;a href="https://stack.lol" rel="noopener noreferrer"&gt;LOLstack&lt;/a&gt; The Perfect Stack™️. Now that's out, let's cover what it has to offer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Enough with the stalling, Access the good stuff&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What you'll get
&lt;/h2&gt;

&lt;p&gt;An App, an API, a Database and all of the in-between that make an App and its stack work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tech stack &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tech used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Mobile app&lt;/strong&gt; that targets iOS, Android &amp;amp; the web&lt;/td&gt;
&lt;td&gt;
&lt;a href="////reactnative.dev"&gt;React Native&lt;/a&gt; &lt;a href="////expo.io"&gt;Expo&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Design system&lt;/strong&gt; for a component-based, modular &amp;amp; consistent design&lt;/td&gt;
&lt;td&gt;
&lt;a href="////eva.design"&gt;Eva Design&lt;/a&gt; &lt;a href="////akveo.github.io/react-native-ui-kitten/"&gt;UI Kitten&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Typing&lt;/strong&gt; for a type-safe runtime &amp;amp; auto-generated interfaces&lt;/td&gt;
&lt;td&gt;&lt;a href="////www.typescriptlang.org"&gt;TypeScript&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Database&lt;/strong&gt; with both relational and unstructured data&lt;/td&gt;
&lt;td&gt;&lt;a href="////www.postgresql.org/docs/current/ddl-rowsecurity.html"&gt;PostgresQL&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;GraphQL API&lt;/strong&gt; autogenerated from the database schemas&lt;/td&gt;
&lt;td&gt;&lt;a href="////www.graphile.org/postgraphile/"&gt;PostGraphile&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;RESTful API&lt;/strong&gt; autogenerated from the database schemas&lt;/td&gt;
&lt;td&gt;&lt;a href="http://postgrest.org" rel="noopener noreferrer"&gt;PostgREST&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Custom RESTful API&lt;/strong&gt; for implementing server-side specific needs&lt;/td&gt;
&lt;td&gt;
&lt;a href="////expressjs.com"&gt;ExpressJS&lt;/a&gt; &lt;a href="////www.typescriptlang.org"&gt;TypeScript&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Authentication flow&lt;/strong&gt; for handling sign-up and sign-in&lt;/td&gt;
&lt;td&gt;&lt;a href="////jwt.io"&gt;JSON Web Token&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Role-based permissions&lt;/strong&gt; for a granular and low-level security&lt;/td&gt;
&lt;td&gt;&lt;a href="////www.postgresql.org/docs/current/ddl-rowsecurity.html"&gt;PostgresQL&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Containers&lt;/strong&gt; for services isolation and reproducibility&lt;/td&gt;
&lt;td&gt;&lt;a href="////www.docker.com"&gt;Docker&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Job queue&lt;/strong&gt; for handling asynchronous tasks&lt;/td&gt;
&lt;td&gt;&lt;a href="////github.com/graphile/worker"&gt;Graphile Worker&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Job scheduler&lt;/strong&gt; for running repetitive automated tasks&lt;/td&gt;
&lt;td&gt;&lt;a href="////github.com/mcuadros/ofelia"&gt;ofelia&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Web proxy&lt;/strong&gt; with SSL certificate handling, access logs&lt;/td&gt;
&lt;td&gt;&lt;a href="////traefik.io"&gt;traefik&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Admin interface&lt;/strong&gt; for accessing &amp;amp; manipulating the data directly&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://sosedoff.github.io/pgweb/" rel="noopener noreferrer"&gt;pgweb&lt;/a&gt; &lt;a href="////www.adminer.org"&gt;adminer&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Unit testing&lt;/strong&gt; for ensuring that code is functional&lt;/td&gt;
&lt;td&gt;
&lt;a href="////jestjs.io"&gt;Jest&lt;/a&gt; &lt;a href="////github.com/mixerp/plpgunit"&gt;plpgunit&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Status page&lt;/strong&gt; to communicate outage and downtime to customers&lt;/td&gt;
&lt;td&gt;&lt;a href="////cachethq.io"&gt;Cachet&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Some of these choices are questionable? Please drop a comment, and let's 👊 discuss 'em softly :)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Don't leave just yet! &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Feeling overwhelmed? Don't. That was the boring part.&lt;/p&gt;

&lt;p&gt;Now is the good part, as booting this stack is just a copy-paste away:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:codename-co/stack.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;
docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🤭 Installing &lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; first would be a good idea by the way.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Open source
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/codename-co/stack" rel="noopener noreferrer"&gt;LOLstack boilerplate&lt;/a&gt; is open source.&lt;br&gt;
This is great news to you right now for your 🤪 crazy app idea.&lt;br&gt;
Happy crafting!&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>reactnative</category>
      <category>programming</category>
      <category>docker</category>
    </item>
    <item>
      <title>Building an App Was Hard. 🤯 But Stop Making Excuses.</title>
      <dc:creator>Arnaud Leymet</dc:creator>
      <pubDate>Sat, 07 Aug 2021 22:10:40 +0000</pubDate>
      <link>https://dev.to/codename/building-an-app-was-hard-but-stop-making-excuses-1552</link>
      <guid>https://dev.to/codename/building-an-app-was-hard-but-stop-making-excuses-1552</guid>
      <description>&lt;h2&gt;
  
  
  Top 4 reasons not working on your MVP
&lt;/h2&gt;

&lt;p&gt;So this 🤪 crazy app idea has been growing in your head lately. Yet nothing has been done about it, as you don't see clearly how nor when building it.&lt;/p&gt;

&lt;p&gt;Business and Market reasons aside, the most common reasons (/cough excuses) not starting working on your crazy idea Minimum Viable Product (MVP) are in my opinion:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;🧍‍♀️ &lt;strong&gt;Being alone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ok you don't have a team yet, but suck it on.&lt;br&gt;
If/when reaching for potential cofounders or hires later in the process, you'll be glad to have your MVP. It'll help convey both your idea and investment in the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⌛ &lt;strong&gt;Takes too much time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sure. Creating something new and different takes time. But what if? is took less than expected?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;😫 &lt;strong&gt;Technology fatigue&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Behind hypes, technology cycles and experts contradictory opinions, there can be some technology fatigue, which will tickle beginners to tech veterans.&lt;br&gt;
Poundering what language, framework and services to use in a project can be daunting and exhausting. But what if the fatigue were no more?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🤯 &lt;strong&gt;Cognitive complexity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's actually sane to think that there is a lot of area to cover for an app to work, and that a lot of knowledge in multiple areas are needed. On top of the actual app development, there is also the question of the database, of the APIs, of the security, authentication, production debugging, etc.&lt;br&gt;
But what if this cognitive complexity were already tackled by others?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Are you thinking of a 5th reason? Please drop your suggestions in the comments 💬&lt;br&gt;
Also, the 🍰 cake is a lie.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  These reasons are outdated &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;What if all these reasons were no more? (Well... Apart being alone, you're on your own mate)&lt;br&gt;
What if there were a kind of a shortcut?&lt;/p&gt;

&lt;p&gt;As lots of us have been tickering, playing and working with lots of technology bits, some of us have converged all this know-how into ready-to-use stacks, that help bootstrapping your next projects.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://codename.co" rel="noopener noreferrer"&gt;codename&lt;/a&gt;, we have been developing our take of what a stack should be.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Featuring &lt;strong&gt;&lt;a href="https://stack.lol" rel="noopener noreferrer"&gt;LOLstack&lt;/a&gt;&lt;/strong&gt;, your ready-to-dev &amp;amp; ready-to-deploy software stack.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Building an App Was Hard. 🤯 Now Stop Making Excuses.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>motivation</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Display Formatted Durations in TypeScript 🗓️</title>
      <dc:creator>Arnaud Leymet</dc:creator>
      <pubDate>Wed, 04 Aug 2021 20:00:21 +0000</pubDate>
      <link>https://dev.to/prod/display-formatted-durations-in-typescript-1975</link>
      <guid>https://dev.to/prod/display-formatted-durations-in-typescript-1975</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formattedDuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;min&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sec&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;` &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;s`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;formattedDuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;//=&amp;gt; "10min"&lt;/span&gt;

&lt;span class="nf"&gt;formattedDuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;//=&amp;gt; "10min 40s"&lt;/span&gt;

&lt;span class="nf"&gt;formattedDuration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6640&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;//=&amp;gt; "110min 40s"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/MYewdgzgLgBAZiATgWwIZSgUwCYBECui6AluDALwwAU2hJ4AXDGPsgEaaICUT0ixYAOYUAfDADeAKBgxQkWBEzAKMWkSikwMAKQwAbAAZps8NBjIBKgLLoAFgDo4AGxBIadDWQD0+g12OImFCEWgAGACTiFmAAvtGRispiBjAA-DChMAlKMRCZTADkBTGhkjGSkggo6Fh4HppUhn6SXl7kYgBEAIwG0R0VVWgYOATqDXoALM2t7TDdvZZTEP2SchAgTpj2LoJUgzUj9eCNk35cQA" rel="noopener noreferrer"&gt;▶️ Try it out&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>7 TypeScript Tricks with Enum (and Fruits) 🧺</title>
      <dc:creator>Arnaud Leymet</dc:creator>
      <pubDate>Tue, 27 Jul 2021 16:06:10 +0000</pubDate>
      <link>https://dev.to/prod/mastering-enums-in-typescript-1c1j</link>
      <guid>https://dev.to/prod/mastering-enums-in-typescript-1c1j</guid>
      <description>&lt;p&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/enums.html" rel="noopener noreferrer"&gt;Enums&lt;/a&gt; are one of the key features of &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Relying on basic enums, (numeric and auto-incremented) is standard and the most common use case. Yet Enums can offer much more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Merge enums&lt;/li&gt;
&lt;li&gt;Enum subsets&lt;/li&gt;
&lt;li&gt;Get the keys of an enum&lt;/li&gt;
&lt;li&gt;Get the values of an enum&lt;/li&gt;
&lt;li&gt;Iterate over an enum keys&lt;/li&gt;
&lt;li&gt;Iterate over an enum values&lt;/li&gt;
&lt;li&gt;const enum&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;In the rest of this post, let's assume the following code is available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;APPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍎&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;BANANA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍌&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;CHERRY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍒&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  1. Merge enums &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Merging enums is pretty straightforward using the pipe &lt;code&gt;|&lt;/code&gt; operator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;OtherFruit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;DATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AnyFruit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;OtherFruit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/KYOwrgtgBAYgTmAlgFygbwFBSgQQAp4AyAolALxQDkgPBuBy+5QDRZQBCOAchzuVdYDL7jZgGEAEsQBK4gJo8agJX3BAXwwZkATwAOwKFMgQ18JMgDOPYgA8AxgBswAE2AAeQygawEKAHSiJ0gHwYAPSB5H5Q6lo6egYeJjwuyJ74RKQAPu5GnmycnBhAA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Enum subsets &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Because cherries may not be as tasty as other fruits, let's exclude them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;YummyFruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CHERRY&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; type YummyFruits = Fruit.APPLE | Fruit.BANANA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/KYOwrgtgBAYgTmAlgFygbwFBSgQQAp4AyAolALxQDkgPBuBy+5QDRZQBCOAchzuVdYDL7jZgGEAEsQBK4gJo8agJX3BAXwwZkATwAOwKFMgQ18JMgDOPYgA8AxgBswAE2AAeQygawEKAHSiJ0gHwYAPSB5H5Q6lo6egYeJjwuyJ74RKQAPu5GnmycnBhAA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Get the keys of an enum dynamically &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This one needs the use of two type operators: &lt;a href="https://www.typescriptlang.org/docs/handbook/2/keyof-types.html#the-keyof-type-operator" rel="noopener noreferrer"&gt;&lt;code&gt;keyof&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://www.typescriptlang.org/docs/handbook/2/typeof-types.html#the-typeof-type-operator" rel="noopener noreferrer"&gt;&lt;code&gt;typeof&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FruitKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; type FruitKey = "APPLE" | "BANANA" | "CHERRY"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;FruitKey&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; ["APPLE", "BANANA", "CHERRY"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/KYOwrgtgBAYgTmAlgFygbwFBSgQQAp4AyAolALxQDkgPBuBy+5QDRZQBCOAchzuVdYDL7jZgGEAEsQBK4gJo8agJX3BAXwwZkATwAOwWAhQBpYGp4BrQwHsAZlHVbLOpMgwB6J+QB81zdvgODRigBE+ETEAVAAPlABbJycYZEBohLSASoAxmYgAM6opmpZPADyAEYAVsBpyAB0eVkAFD4oAJRQAIYFjch+ANoAus6uZB7dQQQkAQxRMVwTUUmSUgH9QA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Get the values of an enum dynamically &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This snippet leverages the &lt;a href="https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html" rel="noopener noreferrer"&gt;Template Literal&lt;/a&gt; type operator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FruitValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; type FruitValue = "🍎" | "🍌" | "🍒"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FruitValue&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; ["🍎", "🍌", "🍒"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/KYOwrgtgBAYgTmAlgFygbwFBSgQQAp4AyAolALxQDkgPBuBy+5QDRZQBCOAchzuVdYDL7jZgGEAEsQBK4gJo8agJX3BAXwwZkATwAOwWAhQA1AIYAbMNooADACRp4SZIvMYA9E-IA+KOq067hk2agAIjpAqAAfIP5QiOC5QJUAYwB7EABnVAA3Y1NUgC4ffWzgAG0AXR4AeQAjACtgBOQAOiz-VIAKWxQASmdXMg9i4NpAhki+Eci40owgA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Iterate over an enum keys &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Looping through the enum keys is as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; APPLE&lt;/span&gt;
&lt;span class="c1"&gt;//    BANANA&lt;/span&gt;
&lt;span class="c1"&gt;//    CHERRY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/KYOwrgtgBAYgTmAlgFygbwFBSgQQAp4AyAolALxQDkgPBuBy+5QDRZQBCOAchzuVdYDL7jZgGEAEsQBK4gJo8agJX3BAXwwYAZgHs4UABQAbYKlUIUUdaqgB5AEYArYAGNkAOgDWwAJ4BnbfCTIAlP7ozPbqIJ7q+k666gDm2kZ+-hjKAPSp5AB8uAQkGOnY2GycnPkZhaIS0hhAA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Iterate over an enum values &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;In the same spirit, looping through the enum values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; 🍎&lt;/span&gt;
&lt;span class="c1"&gt;//    🍌&lt;/span&gt;
&lt;span class="c1"&gt;//    🍒&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/KYOwrgtgBAYgTmAlgFygbwFBSgQQAp4AyAolALxQDkgPBuBy+5QDRZQBCOAchzuVdYDL7jZgGEAEsQBK4gJo8agJX3BAXwwYAZgHs4UABQAbYKlUIUUdaqgB5AEYArYAGNkAOgBuAQ11hgAZ23wkyACUgejM9uog3ur6TrrqAObaRgGBGMoA9OnkAHxQdBiZ2Nj8BVlF1HIYQA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  7. &lt;code&gt;const enum&lt;/code&gt; &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;By default, enums generate a bunch of code when compiled to JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;APPLE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🍎&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BANANA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🍌&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CHERRY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🍒&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Fruit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is however a way not to generate this much code: by leveraging &lt;code&gt;const enum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Adding just a &lt;code&gt;const&lt;/code&gt; in front of our Fruit enum makes a big difference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;APPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍎&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;BANANA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍌&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;CHERRY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🍒&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...as it compiles to nothing. 🕳️&lt;/p&gt;

&lt;p&gt;Just until we use part of its values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chosenFruit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BANANA&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; compiles to:&lt;/span&gt;
&lt;span class="c1"&gt;// var chosenFruit = "🍌";&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/MYewdgzgLgBApmArgWxgMQE6IJawN4BQMMAggApkAyAojALwwDkgPBuBy+4wDREwBCJAcgJL0mzQDL7nbgGEAEtQBK8gJoiWgJX3JAXwIFQkWMAAWICAkw5YDc7gB0fQYIIB6J-QB8MUMgAO2ADZwEDBQIABczq4AbgCGGJ7GpmDWljAAROKpANwEQA" rel="noopener noreferrer"&gt;▶️ Try on TypeScript Playground&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
