<?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: André Hatlo-Johansen</title>
    <description>The latest articles on DEV Community by André Hatlo-Johansen (@andrehatlo).</description>
    <link>https://dev.to/andrehatlo</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%2F837951%2F81a1e10c-8fd7-43ae-8bb8-c33e270a885c.jpeg</url>
      <title>DEV Community: André Hatlo-Johansen</title>
      <link>https://dev.to/andrehatlo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andrehatlo"/>
    <language>en</language>
    <item>
      <title>Vim - The ultimate text editor?</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 14:07:37 +0000</pubDate>
      <link>https://dev.to/andrehatlo/vim-the-ultimate-text-editor-2jd1</link>
      <guid>https://dev.to/andrehatlo/vim-the-ultimate-text-editor-2jd1</guid>
      <description>&lt;h2&gt;
  
  
  Vim
&lt;/h2&gt;

&lt;p&gt;Vim is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as "vi" with most UNIX systems and with Apple macOS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Because we want an addon thats called &lt;code&gt;You complete me&lt;/code&gt;, we cant use the standard &lt;code&gt;vim&lt;/code&gt; that comes with the macbook pro.&lt;/p&gt;

&lt;p&gt;To install the latest version, use homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install vim 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the following infront of your path so when you use &lt;code&gt;vim &amp;lt;file&amp;gt;&lt;/code&gt; it will open the version you just installed via homebrew.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;.zshrc&lt;/code&gt; copy it should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="/usr/local/bin:$PATH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have &lt;code&gt;vim&lt;/code&gt; with python 8 so you can use all the features of your normal text editor in &lt;code&gt;vim&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Ultimate vimrc
&lt;/h3&gt;

&lt;p&gt;The Ultimate vimrc is a collection of vimrc configurations to make easy the usage of vim.&lt;/p&gt;

&lt;p&gt;To download the The Ultimate vimrc, you need to install the git client. If you need install it, use home brew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, download the vimrc files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/amix/vimrc.git ~/.vim_runtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install the complete version, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh ~/.vim_runtime/install_awesome_vimrc.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install the basic version, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh ~/.vim_runtime/install_basic_vimrc.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>editor</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Developer || Slave</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:46:20 +0000</pubDate>
      <link>https://dev.to/andrehatlo/developer-slave-3j7e</link>
      <guid>https://dev.to/andrehatlo/developer-slave-3j7e</guid>
      <description>&lt;h2&gt;
  
  
  Grinding gears as a developer.
&lt;/h2&gt;

&lt;p&gt;I've always wanted to know and build, ever since i was a child and first heard about a kid that built the web based game Mafia back in the late 90's using Javascript.&lt;/p&gt;

&lt;p&gt;You have a motivation behind the actual part of you that is dreaming for the ultimate lego game, which in turn created me as a developer.&lt;/p&gt;

&lt;p&gt;Now i can create and build WHATEVER I WANT! But most of the time that is not the case. Since development is a group based activity, because of bad libraries/code and novice examples that explain nothing but the basis of how you use them and hours of googling to find hacks. Making a developer slave away on his keyboard for hours on end, trying to create something he or she has baked in their mind.&lt;/p&gt;

&lt;p&gt;Nothing is as tedious as banging your head on a keyboard, not getting the results you want when building your ultimate lego project.&lt;/p&gt;

&lt;p&gt;This is when the burn in burnout starts as in a developer, pushing him self to the brink of madness trying to achieve something, anything which can show that he actually can call himself a developer.&lt;/p&gt;

&lt;p&gt;Going through project on project from &lt;code&gt;create-react-app&lt;/code&gt; to &lt;code&gt;create-eth-app&lt;/code&gt; to &lt;code&gt;create-next-app&lt;/code&gt; and just so much libraries to choose both to fetch data and to format data a developer, its like being a whole marathon at once only to be standing still on a treadmill, gliding into a public repo Narnia hell just hoping to complete something so simple set in their mind.&lt;/p&gt;

&lt;p&gt;This is my take on developing personal projects. This is why i give up my personal projects and will be giving the job market another chance to shine light where i need it.&lt;/p&gt;

&lt;p&gt;Give me a job which has a flexible work hours where i can focus my hours on work rather than hours on pay.&lt;/p&gt;

&lt;p&gt;Give me a job that has both in house and remote options.&lt;/p&gt;

&lt;p&gt;Give me a job which is innovating, creative and where you have the freedom to take a nap if your head is on fire.&lt;/p&gt;

&lt;p&gt;We are all biological machines, we need sun, air, freedom and good food to create optimal code.&lt;/p&gt;

&lt;p&gt;Code comes from the mind, where both freedom and curiosity lives.&lt;/p&gt;

&lt;p&gt;Give your peers the freedom to take your software to new highs, because the freedom we have is the freedom we make.&lt;/p&gt;

&lt;p&gt;Strict rules results in shitty and tightly bound spagetti code, drop mic.&lt;/p&gt;

&lt;p&gt;And give all your developers MAC's and nothing else.&lt;/p&gt;

&lt;p&gt;The workflow is like the natural thought process, easy and exciting at the same time.&lt;/p&gt;

&lt;p&gt;Your very best the create engine-ere - André&lt;/p&gt;

</description>
      <category>career</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>GIT Command - Overwrite Trick</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:43:03 +0000</pubDate>
      <link>https://dev.to/andrehatlo/git-command-overwrite-trick-595a</link>
      <guid>https://dev.to/andrehatlo/git-command-overwrite-trick-595a</guid>
      <description>&lt;p&gt;A short post to all those who have difficulty with repository hell. This Git command parts the sea, brings peace and makes the local repository die for your sins.&lt;/p&gt;

&lt;p&gt;Especially in IntelliJ i was faced with this issue numerous times, not being able to switch branches without going through some kind of satanic IntelliJ ritual of saving the repo changes to a shelf.&lt;/p&gt;

&lt;p&gt;The solution is here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Force overwrite of local files from remote repository:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git fetch --all
$ git reset --hard origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To download changes from some other branch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset --hard origin/&amp;lt;insert_other_branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;code&gt;Git fetch&lt;/code&gt; downloads latest updates from remote, but doesn't merge or rebase in local files.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thank the lord! The repo is resurrected back to its stable form!&lt;/p&gt;

&lt;h3&gt;
  
  
  Want to know more, check out the &lt;a href="https://github.github.com/training-kit/downloads/github-git-cheat-sheet.pdf"&gt;Git cheat sheet here!&lt;/a&gt;
&lt;/h3&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>IntelliJ IDE - Productivity Tricks</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:40:27 +0000</pubDate>
      <link>https://dev.to/andrehatlo/intellij-ide-productivity-tricks-2h0g</link>
      <guid>https://dev.to/andrehatlo/intellij-ide-productivity-tricks-2h0g</guid>
      <description>&lt;h2&gt;
  
  
  IntelliJ Tricks to boost productivity
&lt;/h2&gt;

&lt;p&gt;IntelliJ is a smart IDE used to code Java/Scala/Kotlin. It uses something called Jetbrains to almost code for you. Here is my favorite summery of keyboard shortcuts which made me WAY more productive in this heavy IDE.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Moving the cursor&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One word at a time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Cursor&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Move cursor to beginning of line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Home&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Move cursor to end of line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;End&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Moving the lines&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Move line up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Alt + Up&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Move line down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Alt + Down&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Format code&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Duplicate line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + D&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Delete line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Y&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Parameter info:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + P&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Comment out selected line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + /&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Comment out code block:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + /&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Fold code block:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + -/+&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Navigate through code&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To class:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + N&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;To file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + N&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;To symbol:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + Alt + N&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Go back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + &amp;lt;-/-&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Find action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + A&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Search everywhere&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Searches classes/files/symbols/actions)&lt;/li&gt;
&lt;li&gt;Use tab to jump to type&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Shift + Shift&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Nr 1 Productivity killer&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  File tabs
&lt;/h4&gt;

&lt;p&gt;When using intelliJ you collect file tabs of previous files you have looked through or coded in.&lt;/p&gt;

&lt;p&gt;This makes for bad productivity since you would have to pause your work and close the tabs one by one.&lt;/p&gt;

&lt;p&gt;Instead! Disable tabs and use the recent files function!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the find action, search for "tabs placement"&lt;/li&gt;
&lt;li&gt;Disable "tabs placement"&lt;/li&gt;
&lt;li&gt;Then use the following shortcut to navigate your recent files:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Recent files&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + E&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Search in recent files by writing the filename of the file you desire to look/work on.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Recent edited files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + E&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Code selection&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Select line&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Home/End&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Select words&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + &amp;lt;-/-&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Select characters&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + &amp;lt;-/-&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Extending selection&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + W&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Shrinking selection&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + W&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Code completion&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Envoking smart code completion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Ctrl + Space&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Most usefull:&lt;/li&gt;
&lt;li&gt;After the new keyword in an object declaration&lt;/li&gt;
&lt;li&gt;In the list of parameters of a method call&lt;/li&gt;
&lt;li&gt;In return statements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Shift + Ctrl + Space&lt;/code&gt; &lt;code&gt;Twice&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Invokes smart code which completes:&lt;/li&gt;
&lt;li&gt;Static expressions&lt;/li&gt;
&lt;li&gt;Collections, lists and arrays&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Static method completion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Space + Ctrl + Space&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Postfix completion
&lt;/h4&gt;

&lt;p&gt;What is postfix expressions?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postfix notation is used to represent algebraic expressions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PostFixCompletion&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collection&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Postfix expression:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;//...&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;method&lt;/code&gt; method takes in a colleciton of string &lt;code&gt;s&lt;/code&gt;.&lt;br&gt;
By writing &lt;code&gt;s.&lt;/code&gt; then using the &lt;strong&gt;postfix completion shortcut:&lt;/strong&gt; &lt;code&gt;Ctrl + J&lt;/code&gt;&lt;br&gt;
Will bring up a list of postfix expressions to choose.&lt;br&gt;
Filter the list by writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nn&lt;/code&gt; / &lt;code&gt;null&lt;/code&gt; -&amp;gt; Checks expression to be null.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;notnull&lt;/code&gt; -&amp;gt; Checks expression to be not-null.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;synchronized&lt;/code&gt; -&amp;gt; Produces synchronization statement.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;try&lt;/code&gt; -&amp;gt; Inserts statement in try-catch block.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for&lt;/code&gt; -&amp;gt; Iterates over enumerable collection.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fori&lt;/code&gt; -&amp;gt; Iterates with index over collection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forr&lt;/code&gt; -&amp;gt; Iterates with index in reverse order.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Code Generation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Getter &amp;amp; Setter methods&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Alt + Insert&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stub test, setUp, tearDown methods&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Alt + Insert&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Version Control tricks&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Commiting changes:&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + K&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Brings up the built inn commit interface&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Commit flow:
&lt;/h4&gt;

&lt;p&gt;Inside the &lt;strong&gt;commit interface&lt;/strong&gt;, the focus starts in the &lt;code&gt;commit message&lt;/code&gt; box.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Write your commit message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to your &lt;strong&gt;change list&lt;/strong&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift + Tab&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;See the &lt;strong&gt;differance&lt;/strong&gt; in a file:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + D&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Changes here are automatically sent to the change set.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Esc&lt;/code&gt; key to leave diff view.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Revert&lt;/strong&gt; changes in a file:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Alt + Z&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tab&lt;/code&gt; to the &lt;strong&gt;revert&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; key to confirm &lt;strong&gt;revert&lt;/strong&gt; file.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Before commit actions&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Select to perform task before commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Tab&lt;/code&gt; button to move the focus to the &lt;strong&gt;Commit&lt;/strong&gt; button

&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;VC Popup Menu&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Get a popup list of alle VC operations directly from a keyboard shortcut&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Alt + Back Quote&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each list item is accociated with a number which you can access by pressing on your keyboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;When selecting branch, search by typing in your search word.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intellij will automatically filter the branch list as your typing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Reformat:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Tab&lt;/code&gt; to move selection one tab stop to the right&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Shift + Tab&lt;/code&gt; to move selection one tab stop to the left&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ctrl + Alt + L&lt;/code&gt; to reformat current selection or current file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ctrl + W&lt;/code&gt; to extend selection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Alt + 1&lt;/code&gt; to move focus to the project tool window&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TIP!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use &lt;code&gt;Ctrl + W&lt;/code&gt; to expand selection, then &lt;code&gt;Ctrl + Alt + L&lt;/code&gt; to reformat the code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Optimaizing imports&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imports can get messy when coding, which leads to libraries included that are not used.&lt;br&gt;
This can be solved easily by using the &lt;code&gt;optimizing imports&lt;/code&gt; shortcut:;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Alt + O&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Optimize imports on the fly
&lt;/h3&gt;

&lt;p&gt;When this is activated, intellij automatically changes and optimizes the imports as you code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Shift + Ctrl + A&lt;/code&gt; to open the &lt;strong&gt;Actions&lt;/strong&gt; popup search field.&lt;/li&gt;
&lt;li&gt;Search for "&lt;em&gt;optimizing imports on the fly&lt;/em&gt;" and activate it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Only optimize imports on commited files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + K&lt;/code&gt; to bring up the commit interface.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Optimize imports&lt;/code&gt; in the &lt;strong&gt;before commit&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Commit&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Navigate to Compilation Error&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When compiling an application in IntelliJ you will receive errors in the &lt;code&gt;event log&lt;/code&gt;.&lt;br&gt;
Instead of using the mouse to click the error that will send you to the errors location, simply do this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After a compilation error.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Esc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + Alt + Down&lt;/code&gt; to move to next error.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + Alt + Up&lt;/code&gt; to move back to the previous error.&lt;/li&gt;
&lt;li&gt;Then press &lt;code&gt;Esc&lt;/code&gt; to move to the error location.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Bonus&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Language injection
&lt;/h3&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Other's&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MultiCursor
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ctrl + ctrl (hold last ctrl and move cursor)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tutorial</category>
      <category>cheatsheet</category>
    </item>
    <item>
      <title>Reactive Data Streams - quick rxJava Summary</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:36:43 +0000</pubDate>
      <link>https://dev.to/andrehatlo/reactive-data-streams-quick-rxjava-summary-2pci</link>
      <guid>https://dev.to/andrehatlo/reactive-data-streams-quick-rxjava-summary-2pci</guid>
      <description>&lt;p&gt;Inspired by the (Reactive movement - manifesto)[&lt;a href="https://www.reactivemanifesto.org/"&gt;https://www.reactivemanifesto.org/&lt;/a&gt;], rxJava is an implementation of Reactive Stream specification created by Netflix. Reactive streams is a concept for handling data streams asynchronous. &lt;/p&gt;

&lt;p&gt;It is built by Netflix to be able to effectively reduce network chattiness. Their goal with rxJava is to allow the client to invoke a single "heavy" client request that is executed in parallel on the server.&lt;/p&gt;

&lt;p&gt;Its concept is based on an &lt;code&gt;Observable&lt;/code&gt;/&lt;code&gt;Iterable&lt;/code&gt; type and &lt;code&gt;Subscribing&lt;/code&gt; on these to send data streams async.&lt;/p&gt;

&lt;p&gt;The following notes are not explained in high detail. Since in the process of writing this i switched to the &lt;code&gt;Reactor&lt;/code&gt; library, because of upgrading to Spring Boot 2, which needs Java 8 and rxJava only runs Java 6. Both are based on a similar concept but different in structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observable / Iterable
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Observable&lt;/code&gt;&lt;/strong&gt; data type can be thought of as a "push" equivaltent to &lt;code&gt;Iterable&lt;/code&gt; which is "pull".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Iterable&lt;/code&gt;&lt;/strong&gt; data type pulls values from the producer and the thread blocks until those values arrive.&lt;/p&gt;

&lt;p&gt;The producer pushes values to the consumer whenever values are available.&lt;/p&gt;

&lt;p&gt;Which creates an approach which is more flexible, because values can arrive synchronously or async.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Observable&lt;/code&gt; type
&lt;/h3&gt;

&lt;p&gt;Adds two missing semantiqcs which are present in the &lt;code&gt;Iterable&lt;/code&gt; type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Producer can signal to the consumer that there is no more data available.&lt;/li&gt;
&lt;li&gt;Producer can signal to the consumer that an error har occured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes &lt;code&gt;Observable&lt;/code&gt; and &lt;code&gt;Iterable&lt;/code&gt; unified.&lt;/p&gt;

&lt;p&gt;The only difference is the direction which the data flows.&lt;/p&gt;

&lt;p&gt;Always return &lt;code&gt;Observable&lt;/code&gt;, always request &lt;code&gt;Iterable&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Creating an Observable from existing Data structures
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;From existing data structures:&lt;/li&gt;
&lt;li&gt;Use the Observable &lt;code&gt;just()&lt;/code&gt; and &lt;code&gt;from()&lt;/code&gt; methods to convert objects, lists, or arrays of objects into Observables that can emit those objects.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Inserting a list into an observable&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;just&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"one object"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Creating an Observable via the &lt;code&gt;create()&lt;/code&gt; method
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Via the &lt;code&gt;create()&lt;/code&gt; method, you can implement async i/o, computational operations, or even 'infinite' streams of data by designing your own Observable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Synchronous Observable example:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Custom Observable that blocks when subscribed to (does not spawn an extra thread)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;customObservableBlocking&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;aSub&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;aSub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUnsubscribed&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;aSub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onNext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"value_"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="o"&gt;};&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// after sending all values we complete the sequence&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;aSub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUnsubscribed&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;aSub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCompleted&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="n"&gt;customObservableBlocking&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="o"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Asynchronous Observable example:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Observable that emits 75 strings.&lt;/li&gt;
&lt;li&gt;Doesn't block when subscribed to as it spawns a separate thread.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;customObservableNonBlocking&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Runnable&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUnsubscribed&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onNext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"value_"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUnsubscribed&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;});&lt;/span&gt;
            &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="n"&gt;customObservableNonBlocking&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fetch a list of Wiki articles async, in Groovy:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetchWikiArticleAsync&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;wikiArticleNames&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;articleName&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;wikiArticleNames&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUnsubscribed&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onNext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://en.wikipedia.org/wiki/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;articleName&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUnsubscribed&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCompleted&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="n"&gt;fetchWikiArticleAsync&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Tiger"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Elephant"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;"--- Article ---\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;substring&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;125&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="o"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Transforming Observables with Operatiors
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Chain &lt;code&gt;operators&lt;/code&gt; together to transform and compose Observables&lt;/li&gt;
&lt;li&gt;Async call &lt;code&gt;customObservableNonBlock&lt;/code&gt; with chaining:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;simpleComposition&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;customObservableNonBlocking&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;skip&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;stringValue&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;stringValue&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"_xform"&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subscribe&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s"&gt;"onNext =&amp;gt; "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;skip(10)&lt;/code&gt; - Jumps to the 10th value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;take(5)&lt;/code&gt; - Grabs the 5 next values&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;map(...)&lt;/code&gt; - maps each value and concatenates &lt;code&gt;stringValue&lt;/code&gt; with &lt;code&gt;_xform&lt;/code&gt; =&amp;gt; &lt;code&gt;$stringValue_xform&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;subscribe(...)&lt;/code&gt; - returns the mapped values with &lt;code&gt;onNext =&amp;gt;&lt;/code&gt; concatenated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an early rxJava summery. Switching to the &lt;code&gt;reactor&lt;/code&gt; library instead, the concepts are the same but structured differently/more simply and accepts Java 8.&lt;/p&gt;

&lt;p&gt;More information about rxJava, check it out here: (HERE)[&lt;a href="https://github.com/ReactiveX/RxJava"&gt;https://github.com/ReactiveX/RxJava&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>java</category>
      <category>reactive</category>
      <category>programming</category>
    </item>
    <item>
      <title>React Native: Boilerplates overview</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:34:07 +0000</pubDate>
      <link>https://dev.to/andrehatlo/react-native-boilerplates-overview-552g</link>
      <guid>https://dev.to/andrehatlo/react-native-boilerplates-overview-552g</guid>
      <description>&lt;p&gt;It can take a few weeks (if not months) getting started with React Native, can boilerplates give a jump start to mobile development? And if so, which are the best?&lt;/p&gt;

&lt;p&gt;There are three boilerplates worth considering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/infinitered/ignite"&gt;Ignitee&lt;/a&gt; - 9,375 stars&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/futurice/pepperoni-app-kit"&gt;Pepperoni App Kit&lt;/a&gt; - 4,453 stars&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/bartonhammond/snowflake"&gt;Snowflake&lt;/a&gt; - 4,399 stars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will be taking a closer look at the most popular of them all, the &lt;code&gt;ignite&lt;/code&gt; boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignitee CLI
&lt;/h2&gt;

&lt;p&gt;Ignite is now the 'hottest' CLI for React Native.&lt;/p&gt;

&lt;p&gt;It includes boilerplates, plugins, generators and more.&lt;/p&gt;

&lt;p&gt;Ignite requires a Node version of 7.6+ minimum, check your version by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install &lt;a href="https://yarnpkg.com/lang/en/docs/install/"&gt;&lt;code&gt;Yarn&lt;/code&gt;&lt;/a&gt; for your system.&lt;/p&gt;

&lt;p&gt;Then run the following commands to add the &lt;code&gt;ignite-cli&lt;/code&gt; and to create your &lt;code&gt;ignite&lt;/code&gt; boilerplate.&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="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;yarn&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;ignite&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ignite includes two primary boilerplates
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Andross:
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;The tried and true (React Navigation, Redux, &amp;amp; Redux Saga)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/49c1245faf62f39e5a486e0df0f8e5fa281f06ac/687474703a2f2f69725f7075626c69632e73332e616d617a6f6e6177732e636f6d2f70726f6a656374732f69676e6974652f69676e6974652d616e64726f73732d6c61756e63682d73637265656e2e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/49c1245faf62f39e5a486e0df0f8e5fa281f06ac/687474703a2f2f69725f7075626c69632e73332e616d617a6f6e6177732e636f6d2f70726f6a656374732f69676e6974652f69676e6974652d616e64726f73732d6c61756e63682d73637265656e2e706e67" alt="Andross" width="1242" height="2208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React Native 0.57.7&lt;/li&gt;
&lt;li&gt;React Navigation 3.0.0&lt;/li&gt;
&lt;li&gt;Redux&lt;/li&gt;
&lt;li&gt;Redux Sagas&lt;/li&gt;
&lt;li&gt;And more!&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Bowser:
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;The latest and greatest (React Navigation, MobX State Tree, &amp;amp; Typescript)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/b598169ed7d3a9eea78e921acd10adee55bf53eb/687474703a2f2f69725f7075626c69632e73332e616d617a6f6e6177732e636f6d2f70726f6a656374732f69676e6974652f69676e6974652d626f777365722d6c61756e63682d73637265656e2e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/b598169ed7d3a9eea78e921acd10adee55bf53eb/687474703a2f2f69725f7075626c69632e73332e616d617a6f6e6177732e636f6d2f70726f6a656374732f69676e6974652f69676e6974652d626f777365722d6c61756e63682d73637265656e2e706e67" alt="bowser" width="1242" height="2208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This boilerplate includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React Native&lt;/li&gt;
&lt;li&gt;React Navigation&lt;/li&gt;
&lt;li&gt;MobX State Tree&lt;/li&gt;
&lt;li&gt;Typescript&lt;/li&gt;
&lt;li&gt;Reactotron (requires 2.x)&lt;/li&gt;
&lt;li&gt;And more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I won't go into detail about these services in this post. I will choose a preferred boilerplate after testing and explain the services more in detail in a future post.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to:
&lt;/h2&gt;

&lt;p&gt;Lets choose &lt;code&gt;ignite&lt;/code&gt;s newest boilerplate &lt;code&gt;bowser&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First of all to start of a bowser boilerplate, simply run the following command and choose &lt;code&gt;bowser&lt;/code&gt; from the terminal menu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ignite new MyNewAppName
-----------------------------------------------
  (                  )   (
  )\ )   (        ( /(   )\ )    *   )
 (()/(   )\ )     )\()) (()/(  ` )  /(   (
  /(_)) (()/(    ((_)\   /(_))  ( )(_))  )\
 (_))    /(_))_   _((_) (_))   (_(_())  ((_)
 |_ _|  (_)) __| | \| | |_ _|  |_   _|  | __|
  | |     | (_ | | .` |  | |     | |    | _|
 |___|     \___| |_|\_| |___|    |_|    |___|
-----------------------------------------------

An unfair headstart for your React Native apps.
https://infinite.red/ignite

-----------------------------------------------

🔥 igniting app BowserStyle
? Which boilerplate would you like to use? Bowser (React Navigation, MobX State Tree, &amp;amp; TypeScript)
&amp;gt; Bowser  *
&amp;gt; Andross
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you open your &lt;code&gt;NewAppProject&lt;/code&gt; directory, you will see loads of files that come will the &lt;code&gt;ignite&lt;/code&gt; boilerplate compared to the standard setup using &lt;code&gt;react-native new&lt;/code&gt; or &lt;code&gt;expo init&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;Run simulator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For iOS:
  cd ProjectFolder
  react-native run-ios

For Android:
  cd ProjectFolder
  react-native run-android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see what else Ignite CLI can do in the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  cd ProjectFolder
  ignite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project directory structure
&lt;/h3&gt;

&lt;p&gt;The project structure is some more advanced that a simple &lt;code&gt;react-native new&lt;/code&gt; / &lt;code&gt;expo init&lt;/code&gt; default project structure.&lt;/p&gt;

&lt;p&gt;The project structure will look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ignite-project
├── app
│   ├── components
│   ├── i18n
│   ├── models
│   ├── navigation
│   ├── screens
│   ├── services
│   ├── theme
│   ├── utils
│   ├── app.tsx
│   ├── environment-variables.ts
├── storybook
│   ├── views
│   ├── index.ts
│   ├── storybook-registry.ts
│   ├── storybook.ts
├── test
│   ├── __snapshots__
│   ├── storyshots.test.ts.snap
│   ├── mock-i18n.ts
│   ├── mock-reactotron.ts
│   ├── setup.ts
│   ├── storyshots.test.ts
├── README.md
├── android
├── ignite
│   ├── ignite.json
│   └── plugins
├── index.js
├── ios
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets go deeper into the directories included in &lt;code&gt;Bowser&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The &lt;code&gt;./app&lt;/code&gt; directory:
&lt;/h4&gt;

&lt;p&gt;Like when running the default structure commands, the &lt;code&gt;app&lt;/code&gt; directory is present.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;app&lt;/code&gt; directory, it will look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app
│── components
│── i18n
├── models
├── navigation
├── screens
├── services
├── theme
├── utils
├── app.tsx
├── environment-variables.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;components:&lt;/strong&gt;&lt;br&gt;
This is where your components live. Normally you would have components created with a &lt;code&gt;.js&lt;/code&gt; file. Since &lt;code&gt;bowser&lt;/code&gt; includes typescript, each component will have a directory containing a &lt;code&gt;.tsx&lt;/code&gt; file, along with a &lt;code&gt;story.tsx&lt;/code&gt; file. Optionally if the component is large, the component directory can include &lt;code&gt;preset.ts&lt;/code&gt;, and &lt;code&gt;props.ts&lt;/code&gt; files for better organisation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i18n:&lt;/strong&gt;&lt;br&gt;
If you included the &lt;code&gt;react-native-i18n&lt;/code&gt; service, this is where your translations live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;models:&lt;/strong&gt;&lt;br&gt;
This is where your models and model logic lives. Each model has a directory that contains the &lt;code&gt;mobx-state-tree&lt;/code&gt; model file, test file, and other supported files like actions, types etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;navigation:&lt;/strong&gt;&lt;br&gt;
Your &lt;code&gt;react-navigation&lt;/code&gt; files live here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;screens:&lt;/strong&gt;&lt;br&gt;
The react screen component which takes up the entire screen and is part of the navigation hierarchy lives here. Each directory contains the &lt;code&gt;.tsx&lt;/code&gt; file, assets or helper files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;services:&lt;/strong&gt;&lt;br&gt;
Services that interface with the outside world like REST APIs, Push Notifications etc, live here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;theme:&lt;/strong&gt;&lt;br&gt;
Your theme lives here, built including spacing, colors, typography, timing etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;utils:&lt;/strong&gt;&lt;br&gt;
Shared files like helpers, utilities like date helpers, formatters etc are often placed here. If a helper or utility is only used by a specific component/model in your application the file should live with that component/model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app.tsx:&lt;/strong&gt;&lt;br&gt;
Your entry point to your application. The main App component that renders the rest of the application. You can also choose if you would like to run the app in storybook mode.&lt;/p&gt;
&lt;h4&gt;
  
  
  The &lt;code&gt;./ignite&lt;/code&gt; directory:
&lt;/h4&gt;

&lt;p&gt;This is where the &lt;code&gt;ignite&lt;/code&gt; CLI and all things &lt;code&gt;ignite&lt;/code&gt; live. Generators, plugins and examples are included to help you get started.&lt;/p&gt;
&lt;h4&gt;
  
  
  The &lt;code&gt;./storybook&lt;/code&gt; directory:
&lt;/h4&gt;

&lt;p&gt;This is where stories will be registered and where the Storybook configs will live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://storybook.js.org/basics/guide-react-native/"&gt;Storybook&lt;/a&gt; is a UI development environment for rapid iteration and testing of UI components. This allows you to visualise the different states of the individual components of your app and test the UI interactions.&lt;/p&gt;
&lt;h4&gt;
  
  
  The &lt;code&gt;./test&lt;/code&gt; directory:
&lt;/h4&gt;

&lt;p&gt;This is where your Jest configs and mocks live. As well as storyshots test files.&lt;/p&gt;
&lt;h2&gt;
  
  
  Attaching to Expo
&lt;/h2&gt;

&lt;p&gt;If you are like me and use the &lt;code&gt;expo&lt;/code&gt; toolchain to kick of your project, and you would still like to use one of Ignites boilerplates simply use the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expo init &amp;lt;AppName&amp;gt;
cd &amp;lt;AppName&amp;gt;
ignite attach
// Then choose which boilerplate you would like to use
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This also works for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create-react-native-app&lt;/li&gt;
&lt;li&gt;create-react-app&lt;/li&gt;
&lt;li&gt;normal Reach JS projects&lt;/li&gt;
&lt;li&gt;empty directories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not all plugins work in all environments, but many features of Ignite CLI are available.&lt;/p&gt;

&lt;p&gt;For more info check out their documentation at &lt;a href="https://expo.io/"&gt;https://expo.io/&lt;/a&gt; !&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Home Assistant - Lovelace introduction: Step 3</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:31:37 +0000</pubDate>
      <link>https://dev.to/andrehatlo/home-assistant-lovelace-introduction-step-3-3232</link>
      <guid>https://dev.to/andrehatlo/home-assistant-lovelace-introduction-step-3-3232</guid>
      <description>&lt;p&gt;Home Assistant recently came out with their updated UI January 2019. &lt;/p&gt;

&lt;p&gt;A ui called Lovelace it has now become their default ui interface. Taking a new approach for building user interfaces for Home Assistant.&lt;/p&gt;

&lt;p&gt;Note! I had to cut this project short because of the timeframe for my new job, but here is a quick overview over my custom Lovelace UI which i was able to put together.&lt;/p&gt;

&lt;p&gt;A dynamic UI with a whole new set of features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;24 card grid.&lt;/li&gt;
&lt;li&gt;A UI editor.&lt;/li&gt;
&lt;li&gt;Faster!&lt;/li&gt;
&lt;li&gt;And fully customizable

&lt;ul&gt;
&lt;li&gt;Cards have a list of attributes and options which can alter how your data is presented.&lt;/li&gt;
&lt;li&gt;Themes!&lt;/li&gt;
&lt;li&gt;Entity overriding privileges (name and icon).&lt;/li&gt;
&lt;li&gt;Custom cards built from the HA community.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kMJyUX0r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8xm1mp6b2gkcrimawb0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kMJyUX0r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8xm1mp6b2gkcrimawb0l.png" alt="Image description" width="880" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is whats so fun about this new platform is that the community is blooming. Make HA work for you!&lt;/p&gt;

&lt;p&gt;Take a look at my UI in mobile view:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p1uf7YRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1dph5iybt2xc3aaq0r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p1uf7YRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1dph5iybt2xc3aaq0r5.png" alt="Image description" width="410" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IZ-szT5O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bo0tl9wjrfdca842ueew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IZ-szT5O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bo0tl9wjrfdca842ueew.png" alt="Image description" width="407" height="834"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---2rcrWRQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcpa1joz4uqqmjzw1lgz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---2rcrWRQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcpa1joz4uqqmjzw1lgz.png" alt="Image description" width="411" height="819"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--79w57g_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a5qp7ne4dmcdeuh4r4ka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--79w57g_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a5qp7ne4dmcdeuh4r4ka.png" alt="Image description" width="408" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DDSErCaj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gpzwkzc5e9a2s5v83jmm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DDSErCaj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gpzwkzc5e9a2s5v83jmm.png" alt="Image description" width="410" height="824"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uhreML2i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53n1s6fl0z6is3cwkhtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uhreML2i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53n1s6fl0z6is3cwkhtv.png" alt="Image description" width="407" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Home Assistant - Configuring devices: Step 2</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:26:36 +0000</pubDate>
      <link>https://dev.to/andrehatlo/home-assistant-configuring-devices-step-2-k2c</link>
      <guid>https://dev.to/andrehatlo/home-assistant-configuring-devices-step-2-k2c</guid>
      <description>&lt;p&gt;If you haven't seen my last post on how to install Home Assistant on a Rapsberry Pi, check my previous post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Successfully installed Home assistant on a Raspberry Pi&lt;/li&gt;
&lt;li&gt;Some type of smart device and gateway connected to your network&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration of devices:
&lt;/h2&gt;

&lt;p&gt;Go to your HA web interface by typing &lt;a href="http://ipaddress:8123"&gt;http://ipaddress:8123&lt;/a&gt; in your browser.&lt;/p&gt;

&lt;p&gt;The main menu will look something like this:&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;Main menu&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zb8ExXxa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ir8zfiz8x9q6hs9dzo7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zb8ExXxa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ir8zfiz8x9q6hs9dzo7.png" alt="HA Main menu" width="254" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overview&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;This is where your UI exists.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;HA has a map interface for tracking and estimating time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logbook&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Here HA logs all events that happen in your smart home.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Check out your sensors/devices/places history, how they act over time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MDI Icon Index&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;This is a custom icon page i added, i will get back to this and show you how this is done.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Everything you can do with HA gets configured here.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;Configuration&lt;/code&gt; menu
&lt;/h3&gt;

&lt;p&gt;Select &lt;code&gt;configuration&lt;/code&gt; in the &lt;code&gt;main menu&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You will see a menu that looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QFSgF9cG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ios6nc2104aq3rn2f6ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QFSgF9cG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ios6nc2104aq3rn2f6ph.png" alt="HA Config" width="625" height="875"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Home Assistant Cloud&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up for the HA Cloud service, this makes it possible to use your interface from all around the world. Without any port forwarding.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Integrations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All new devices on your network has to get setup here before anything else.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add user accounts that can access HA web interface here.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here you can restart your server/core/groups/automations/scripts and validate your configuration files for quick debugging.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Persons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add people and connect them to the user account you would like.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Entity Registry&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An overview over all devices. Also possible to override naming for each device.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Area Registry&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define the places in your home. For example bathroom, kitchen, livingroom etc. These places can then be assigned to each of your devices.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here is where the magic happens. Where you can automate your smart devices as you see fit. Turn off all lights after 23:00 or set the temperature up after 07:00.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Script&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Script actions to be used in Lovelace UI. For example create a &lt;code&gt;restart HA&lt;/code&gt; script that calls action &lt;code&gt;homeassistant.restart&lt;/code&gt; so you can easily restart the server from your UI.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Z-Wave&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You will probably not have this in your configuration unless you've activated z-wave in your &lt;code&gt;configration.yaml&lt;/code&gt; file. Here is where you can add Z-wave nodes and configure them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tweak entity attributes or add/edit customizations that override the enities attributes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;Integrations&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In the configuration menu, go to &lt;code&gt;Integrations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Under &lt;code&gt;Discovered&lt;/code&gt; you'll see all devices Home Assistant can find on your network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IMWUoqeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kss0r5cn8mqj8dvcx5f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IMWUoqeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kss0r5cn8mqj8dvcx5f.png" alt="HA Discovered" width="676" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Home assistant has made integrating devices as easy as pie. Just hit the button &lt;code&gt;CONFIGURE&lt;/code&gt; and follow the steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  IKEA tradfri integration
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;CONFIGURE&lt;/code&gt; next to IKEA TRÅDFRI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VgG3tSbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pnffl9ztf5b46ccfjooj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VgG3tSbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pnffl9ztf5b46ccfjooj.png" alt="Ikea connect" width="409" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill inn the &lt;code&gt;Security Code&lt;/code&gt; from underneath your IKEA Trådfri Gateway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---yb1Igm0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tisakdh0twtfyywpbihi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---yb1Igm0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tisakdh0twtfyywpbihi.png" alt="Ikea security code" width="880" height="1173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Submit&lt;/code&gt; and accept the list of IKEA Trådfri devices HA lists up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phillips hue integration
&lt;/h3&gt;

&lt;p&gt;Click &lt;code&gt;CONFIGURE&lt;/code&gt; next to Philips Hue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eZwLToRf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pdvudsfqhexq82ra5w4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eZwLToRf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pdvudsfqhexq82ra5w4n.png" alt="Philips hue gateway" width="495" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Locate your Philips gateway and press the button located on topp of the gateway.&lt;/p&gt;

&lt;p&gt;Then accept all devices HA lists up in the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Back in &lt;code&gt;Integrations&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;You should now have a list of devices depending on what you have configured from integrations.&lt;/p&gt;

&lt;p&gt;This is what my list looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aFlxMXUE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8oz0g6muqeh5sv3b48h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aFlxMXUE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8oz0g6muqeh5sv3b48h.png" alt="HA Integrations" width="672" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer tools
&lt;/h2&gt;

&lt;p&gt;Underneath the Main menu you will see the &lt;code&gt;Developer tools&lt;/code&gt;, this is worth mentioning since it will be used a lot during the device automation/configuration stage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--urXblSid--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/15blvir7dyr4o1r0o5d8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--urXblSid--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/15blvir7dyr4o1r0o5d8.png" alt="HA Dev tools" width="255" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Services (remote control icon)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here its possible to run/test all services that HA has integrated.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;States (&amp;lt; &amp;gt; icons)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is the place to have total control over ALL your entities.&lt;/li&gt;
&lt;li&gt;Check if their online, or if they exist at all.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Events (radio tower icon)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I havent personally used this function much, but as far as i know this is the place to run events.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Templates (document &amp;lt;&amp;gt; icon)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When doing advanced configuration with HA, its possible to create templates that act as sensors. This is the place to test your tempates and see if you get the return values your looking for.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;About (info icon)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The place to check your HA version or to check what the HA log is outputting.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope this gives a better understanding of the fundamentals of HA and how to configure devices on your network.&lt;/p&gt;

&lt;h1&gt;
  
  
  Want more?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Get familiar with Home Assistant by reading the &lt;a href="https://www.home-assistant.io/docs/"&gt;docs&lt;/a&gt;!
&lt;/h2&gt;

</description>
      <category>homeassistant</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Home Assistant - HA &amp; PI: Step 1</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:21:09 +0000</pubDate>
      <link>https://dev.to/andrehatlo/home-assistant-ha-pi-step-1-57im</link>
      <guid>https://dev.to/andrehatlo/home-assistant-ha-pi-step-1-57im</guid>
      <description>&lt;h3&gt;
  
  
  Automating my home with home assistant and raspberry pi. How to install HA on the Raspberry Pi 3 B+ ?
&lt;/h3&gt;

&lt;p&gt;There are almost 8.4 billion internet of things (IoT) across the world right now. The number of devices are expected to more than double the next couple of years to the stage of 20.4 billion in 2020. The problem with all these devices are that each and every brand of smart device has their own gateway and platform to automate and control. This is where Home Assistant steps in.&lt;/p&gt;

&lt;p&gt;Home assistant is an open source platform where all your digital smart things can talk to each other. Implemented with an raspberry pi, you can shedual or command events for your smart devices (events as turn up heat when cold outside, or dim lights after 21:00).&lt;/p&gt;

&lt;p&gt;Home assistant can run on any always connected operating system that supports Python 3 apps, and its very lightweight and small. Which makes it great to run on a Raspberry Pi.&lt;/p&gt;

&lt;p&gt;My smart devices range from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IKEA tradfri

&lt;ul&gt;
&lt;li&gt;Bulbs&lt;/li&gt;
&lt;li&gt;Motion sensor&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Philips hue bulbs and motion detectors

&lt;ul&gt;
&lt;li&gt;Bulbs&lt;/li&gt;
&lt;li&gt;Motion sensor&lt;/li&gt;
&lt;li&gt;Temperature sensor&lt;/li&gt;
&lt;li&gt;Light sensor&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Sonos

&lt;ul&gt;
&lt;li&gt;Two speakers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Gooogle Cast

&lt;ul&gt;
&lt;li&gt;Livingroom tv with Android OS&lt;/li&gt;
&lt;li&gt;Nvidea Shield on my bedroom tv&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Z-wave

&lt;ul&gt;
&lt;li&gt;Door/Window sensor&lt;/li&gt;
&lt;li&gt;USB gateway&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To create a setup where all these different brands of devices can talk to each other i'll create a new home automation server on my Raspberry Pi 3B+.&lt;/p&gt;

&lt;p&gt;Follow this guide for a easy setup. And follow my blog for more information, ideas and guides for Home Assistant that i will post in the near future!&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Raspberry Pi 3B+ (Recommended)&lt;/li&gt;
&lt;li&gt;Micro SD (At least 32gb)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.raspberrypi.org/downloads/raspbian/"&gt;Raspbian (Stretch light)&lt;/a&gt; installed on micro sd card&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing Home Assistant on raspbian
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enable SSH
&lt;/h3&gt;

&lt;p&gt;Assuming raspbian is already installed on the raspberry pi.&lt;/p&gt;

&lt;p&gt;Make sure your connected to your local network, control by running &lt;code&gt;ifconfig&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Activate SSH on the raspberry pi by running &lt;code&gt;sudo raspi-config&lt;/code&gt; in the terminal window.&lt;/p&gt;

&lt;p&gt;Then select &lt;code&gt;Interfacing Options&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;code&gt;SSH&lt;/code&gt; and select it.&lt;/p&gt;

&lt;p&gt;Choose &lt;code&gt;Yes&lt;/code&gt; and select &lt;code&gt;Ok&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then choose &lt;code&gt;Finish&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connect by SSH and install HA
&lt;/h3&gt;

&lt;p&gt;To connect to your Raspberry Pi over SSH run the following command in terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Default password is: raspberry
$ ssh pi@piaddress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the default password by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update your pi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get upgrade -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt-get install python3 python3-venv python3-pip libffi-dev libssl-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a homeassistant user with groups &lt;code&gt;dialout&lt;/code&gt; and &lt;code&gt;gpio&lt;/code&gt;. Dialout is required for using Z-Wave and Zigbee controllers, while GPIO is required to communicate with Raspberry's GPIO.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo useradd -rm homeassistant -G dialout,gpio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a directory for the installation in &lt;code&gt;/srv&lt;/code&gt; directory and set owner permissions to the &lt;code&gt;homeassistant&lt;/code&gt; account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd /srv
$ sudo mkdir homeassistant
$ sudo chown homeassistant:homeassistant homeassistant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create and change to a virtual environment for Home assistant as the &lt;code&gt;homeassistant&lt;/code&gt; account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo -u homeassistant -H -s
$ cd /srv/homeassistant
$ python3 -m venv .
$ source bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the virtual environment is activated, run the following command to install a required python package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ (homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ python3 -m pip install wheel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Last but not least, install Home Assistant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ (homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ pip3 install homeassistant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To complete the installation, start Home Assistant for the first time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(homeassistant) $ hass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create the &lt;code&gt;.homeassistant&lt;/code&gt; directory under the &lt;code&gt;home/homeassistant&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;If the installation was successful you can reach the Home Assistant web interface on &lt;a href="http://ipaddress:8121"&gt;http://ipaddress:8121&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autostart Home Assistant on boot
&lt;/h2&gt;

&lt;p&gt;Since the raspberry pi will host the Home Assistant server i would like to create a deamon that autostarts Home Assistant on boot.&lt;/p&gt;

&lt;p&gt;A service file is needed to control Home Assistant with &lt;code&gt;systemd&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create the template below with &lt;code&gt;sudo&lt;/code&gt; rights with the following path &lt;code&gt;/etc/systemd/system/home-assistant@homeassistant.service&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# /etc/systemd/system/home-assistant@homeassistant.service

[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=%i
ExecStart=ExecStart=/srv/homeassistant/bin/hass -c "/home/%i/.homeassistant"

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now reload &lt;code&gt;systemd&lt;/code&gt; to make the deamon aware of the new configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl --system daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable the home assistant service to automatically start on boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl enable home-assistant@homeassistant.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To start the service run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl start home-assistant@homeassistant.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go to your Home Assistant web interface by going to &lt;a href="http://ipaddress:8123"&gt;http://ipaddress:8123&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next time we will show how to setup your smart devices in HA and configure them so that you can access them all.&lt;/p&gt;

&lt;p&gt;Follow my blog for more information, ideas and guides for Home Assistant that i will post in the near future!&lt;/p&gt;

&lt;h2&gt;
  
  
  Want more?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Get familiar with Home Assistant by reading the &lt;a href="https://www.home-assistant.io/docs/"&gt;docs&lt;/a&gt;!
&lt;/h3&gt;

</description>
      <category>raspberrypi</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>React Native: State vs Props</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:12:46 +0000</pubDate>
      <link>https://dev.to/andrehatlo/react-native-state-vs-props-33h7</link>
      <guid>https://dev.to/andrehatlo/react-native-state-vs-props-33h7</guid>
      <description>&lt;p&gt;The question that confuses most beginners in react.&lt;/p&gt;

&lt;p&gt;What is the difference of props and state?&lt;/p&gt;

&lt;p&gt;Lets clarify this.&lt;/p&gt;

&lt;p&gt;Props includes data which we give to a component.&lt;/p&gt;

&lt;p&gt;State includes data that is local or private to that component. So other components cannot access that state, it s completely internal to that component.&lt;/p&gt;

&lt;p&gt;Lets say we have a Counters component.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Counters&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;        
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Counter&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Counters&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you take a closer look at the &lt;code&gt;render&lt;/code&gt; method of the &lt;code&gt;Counters&lt;/code&gt; component:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Counter&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All attributes we are setting here are part of the &lt;code&gt;props&lt;/code&gt;, the input to the &lt;code&gt;Counter&lt;/code&gt; component.&lt;/p&gt;

&lt;p&gt;We cannot access the &lt;code&gt;state&lt;/code&gt; of this component. It is local and internal to that component.&lt;/p&gt;

&lt;p&gt;Props is read only, for example lets look at the &lt;code&gt;Counter&lt;/code&gt; component.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;handleIncrement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;badge badge-warning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
          &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handleIncrement&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;btn btn-secondary btn-sm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look closer at the helper method &lt;code&gt;handleIncrement&lt;/code&gt;, which increments the counter by one:&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="nx"&gt;handleIncrement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&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;If we update the &lt;code&gt;handleIncrement&lt;/code&gt; method to update the &lt;code&gt;props.value&lt;/code&gt; like this:&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="nx"&gt;handleIncrement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// this.setState({value: this.state.value + 1});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we increment it in the view, we would get this error:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bKnRD2uW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/gyXg32t/Screenshot-2019-02-19-at-09-51-31.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bKnRD2uW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/gyXg32t/Screenshot-2019-02-19-at-09-51-31.png" alt="react-native prop error" width="880" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So react does not allow you to change any props to any component.&lt;/p&gt;

&lt;p&gt;If you would like to modify the input during the lifecycle of a component, you have to get that input and put it in the state like initially done in the &lt;code&gt;handleIncrement&lt;/code&gt; method:&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="nx"&gt;handleIncrement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  More information about state and props
&lt;/h2&gt;

&lt;p&gt;For more information about &lt;a href="https://facebook.github.io/react-native/docs/state"&gt;state&lt;/a&gt; and &lt;a href="https://facebook.github.io/react-native/docs/props"&gt;props&lt;/a&gt; visit the react &lt;a href="https://facebook.github.io/react-native/docs"&gt;docs.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>Starting a React Native project with Expo</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:07:05 +0000</pubDate>
      <link>https://dev.to/andrehatlo/starting-a-react-native-project-with-expo-3l6p</link>
      <guid>https://dev.to/andrehatlo/starting-a-react-native-project-with-expo-3l6p</guid>
      <description>&lt;p&gt;For React Native we need &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;Watchman&lt;/code&gt;, React Native CLI and &lt;code&gt;Xcode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A javascript package manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watchman:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A service for watching changes in files and trigger actions when files are changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;React Native CLI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A command line interface module for React Native.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xcode:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apples IDE to test your application on an Iphone simulator.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Install &lt;code&gt;node&lt;/code&gt; and &lt;code&gt;Watchman&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Install node and watchman using &lt;a href="https://brew.sh/index_se.html"&gt;Homebrew&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install node
brew install watchman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Install React Native CLI
&lt;/h2&gt;

&lt;p&gt;Install React Native CLI with the node package manager (npm).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g react-native-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Install Xcode and the Xcode Command line tools.
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://itunes.apple.com/us/app/xcode/id497799835?mt=12"&gt;Xcode from the app store&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Xcode preferences, go to &lt;code&gt;locations&lt;/code&gt; and download the Xcode CLI found at &lt;code&gt;Command Line Tools&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Go to &lt;code&gt;Components&lt;/code&gt; and download a simulator of your choice, preferably the newest.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Starting a React Native project
&lt;/h2&gt;

&lt;p&gt;Now you can run these commands in your terminal to start of a React Native project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;react-native init MyApp
cd MyApp
react-native run-ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will initiate a React Native project, and showcase it in an iOS simulator that should look similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IgjuSkVM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/v1/../assets/images/React-native-ios.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IgjuSkVM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/v1/../assets/images/React-native-ios.png" alt="react-native" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expo
&lt;/h2&gt;

&lt;p&gt;Expo is a free toolchain built around React Native like &lt;code&gt;react-native&lt;/code&gt; to help build native iOS and Android projects.&lt;/p&gt;

&lt;p&gt;The toolchain provides tools to simplify development of React Native apps by supplying components of users interface and services that are normally available in third-party native React Native components. All these you can find in Expo SDK.&lt;/p&gt;

&lt;p&gt;Simply install the Expo CLI and run the simulator by running the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g expo-cli
expo init MyApp
cd MyApp
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last command will start Metro Bundler, which is a HTTP server that compiles the JavaScript code of our app using Babel and serves it to the Expo app.&lt;/p&gt;

&lt;p&gt;You will also notice it pops open the Expo Dev Tools, a control panel for developing your app, in your default browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open the app on your phone or simulator
&lt;/h3&gt;

&lt;p&gt;Looking at the Expo Dev Tools, you have available options on which type of simulator you would like to run (Android or iOS). And you have the option to scan the QR code to run the app on your phone in real time using Live Reload.&lt;/p&gt;

&lt;p&gt;All you have to do is download the &lt;a href="https://expo.io/tools#client"&gt;Expo app&lt;/a&gt; on either Android or iPhone and scan the QR code, and you are ready to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Native Documentation:
&lt;/h3&gt;

&lt;p&gt;Learn more about how React Native works by looking at the &lt;a href="https://facebook.github.io/react-native/docs/tutorial.html"&gt;docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>react</category>
      <category>expo</category>
      <category>reactnative</category>
      <category>webdev</category>
    </item>
    <item>
      <title>TypeScript syntax summary</title>
      <dc:creator>André Hatlo-Johansen</dc:creator>
      <pubDate>Mon, 28 Mar 2022 07:05:35 +0000</pubDate>
      <link>https://dev.to/andrehatlo/typescript-syntax-summary-2a4g</link>
      <guid>https://dev.to/andrehatlo/typescript-syntax-summary-2a4g</guid>
      <description>&lt;p&gt;I use this blog to store information I may need to refresh up on at a later date.&lt;/p&gt;

&lt;p&gt;Reference to FlavioCopes blog, a great place to learn.&lt;/p&gt;

&lt;p&gt;TypeScript is one of the fastest rising technologies of 2018. This brief summary is filled with what you need to know to understand its key concepts.&lt;/p&gt;




&lt;p&gt;TypeScript is built by Microsoft. Its open source, developed public at &lt;a href="https://github.com/Microsoft/TypeScript"&gt;https://github.com/Microsoft/TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A superset of ECMAScript 2015, also know as ES6, which means that any valid JS is also valid TypeScript.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;npm install -g typescript&lt;/code&gt;  to globally install the TypeScript compiler on your system, available to you using the &lt;code&gt;tsc&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;Create an &lt;code&gt;app.ts&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Write your first program:&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;const&lt;/span&gt; &lt;span class="nx"&gt;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello world!&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;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see, its just plain JavaScript, but stored in a &lt;code&gt;.ts&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Compile the program using the &lt;code&gt;tsc app.ts&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;The compiler compiles the program into a new file: &lt;code&gt;app.js&lt;/code&gt;, with this content:&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;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello world!&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;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like &lt;em&gt;old JavaScript&lt;/em&gt;, the TS compiler compiles TypeScript to ES5 by default, which means that its almost guaranteed to be suppored by all modern browsers.&lt;/p&gt;

&lt;p&gt;To change the compilation target to another version, for example to ES2018 run the following:&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="s2"&gt;`tsc app.ts --target ES2018`&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello world!&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;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here almost nothing changed except for the additional semicolons.&lt;/p&gt;

&lt;p&gt;Play around with TS to JS compilation, check out &lt;a href="https://www.typescriptlang.org/play/"&gt;https://www.typescriptlang.org/play/&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  TYPING
&lt;/h2&gt;



&lt;p&gt;Most important functionality provided by TypeScript is the type system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;static types&lt;/li&gt;
&lt;li&gt;interfaces&lt;/li&gt;
&lt;li&gt;type interence&lt;/li&gt;
&lt;li&gt;enums&lt;/li&gt;
&lt;li&gt;hybrid types&lt;/li&gt;
&lt;li&gt;generics&lt;/li&gt;
&lt;li&gt;union/intersection types&lt;/li&gt;
&lt;li&gt;access modifiers&lt;/li&gt;
&lt;li&gt;null checking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It resembles languages like Go or C, so if you've coded these languages you already know how this works. Unike dynamic languages like Python or Ruby, this is all new.&lt;/p&gt;

&lt;p&gt;The type system allows adding types to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;variables&lt;/li&gt;
&lt;li&gt;function arguments&lt;/li&gt;
&lt;li&gt;function return types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Giving a more rigid structure to your programs.&lt;/p&gt;

&lt;p&gt;This is how:&lt;/p&gt;
&lt;h3&gt;
  
  
  You define a string variable in TypeScript:
&lt;/h3&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;greeting&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;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  A function accepts an argument of a specific type:
&lt;/h3&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;multiply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&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="nx"&gt;b&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  You declare their return value:
&lt;/h3&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;multiply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&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="nx"&gt;b&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;number&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Valid types are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;number&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;string&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; &lt;code&gt;enum&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;void&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;any&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;never&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tuple&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;any&lt;/code&gt; is a type that identifies, as its name says, &lt;strong&gt;any&lt;/strong&gt; type.&lt;/p&gt;


&lt;h2&gt;
  
  
  CLASSES
&lt;/h2&gt;



&lt;p&gt;Like JavsScript, you declare classes like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&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;Defining class fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fields are public by default. You can set a field to be &lt;code&gt;private&lt;/code&gt; or &lt;code&gt;protected&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Private fields can only be accessed by the class that its declared in.&lt;/p&gt;

&lt;p&gt;Protected fields can only be accessed by deriving classes.&lt;/p&gt;

&lt;p&gt;TypeScript also has &lt;code&gt;static&lt;/code&gt; fields, which are class fields instead of object fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;numberOfWheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;initialize&lt;/code&gt; fields with a constructor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;

  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;theColor&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;Shorthand syntax to make it simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;

  &lt;span class="nx"&gt;printColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;printColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A field can be &lt;code&gt;read only&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;in this case its value can only be set in the constructor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Class methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are driving the car&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You create objects from those classes, like in JavaScript, using the &lt;code&gt;new&lt;/code&gt; keyword:&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;myCar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can extend an existing class using the &lt;code&gt;extend&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;ElectricCar&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;//..&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call &lt;code&gt;super()&lt;/code&gt; in the constructor and in methods to call the extended class corresponding method.&lt;/p&gt;



&lt;h2&gt;
  
  
  ACCESSORS
&lt;/h2&gt;




&lt;p&gt;Getters and setters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;

  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_color&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  ABSTACT CLASSES
&lt;/h2&gt;




&lt;p&gt;To define an abstract class there needs to be a class that extends it, and implements its eventual abstact methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;abstact&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;SportsCar&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are driving a sports car&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  INTERFACES
&lt;/h2&gt;




&lt;p&gt;Interfaces build upon basic types. Use an interface as a type, and its interface can contain other type definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;SetOfNumbers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;a&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="nl"&gt;b&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="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SetOfNumbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An interface can also be an interface for a class implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;SportsCar&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;

  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//..&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are driving a sports car&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  FUNCTION FEATURES
&lt;/h2&gt;




&lt;p&gt;Functions can have optional parameters using the &lt;code&gt;?&lt;/code&gt; symbol after the parameter name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kilometers&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kilometers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Drive the car for ${kilometers} kilometers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Drive the car&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="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;Parameters can have default 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;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kilometers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Drive the car for ${kilometers} kilometers&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Functions can accept a verying number of parameters by using rest parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kilometers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;occupants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Drive the car for ${kilometers} kilometers, with those people on it:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;occupants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Andre&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Peter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Roger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  ENUMS
&lt;/h2&gt;




&lt;p&gt;A great way to defined named constants.&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;Order&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;First&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Third&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Fourth&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simply reference &lt;code&gt;Order.First&lt;/code&gt;, &lt;code&gt;Order.Second&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;You can assign values to constants explicitly:&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;Order&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;First&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Second&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Third&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Fourth&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or use strings:&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;Order&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;First&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FIRST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SECOND&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Third&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;THIRD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Fourth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FOURTH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  GENERICS
&lt;/h2&gt;




&lt;p&gt;A new feature not available in many programming languages. You can create a function, interface or class that works with different types, without specifying the type up front.&lt;/p&gt;

&lt;p&gt;It is mutable, so if you change the type at compile time, the compiler will throw an error.&lt;/p&gt;

&lt;p&gt;We could do this by omitting types to all or using &lt;code&gt;any&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But with generics all the tooling is going to be able to help us.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hi ${a.name}&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;greet&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;André&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;T&lt;/code&gt; symbol identifies a generic type.&lt;/p&gt;

&lt;p&gt;the type can be resistricted to a certain class family or interface, using the &lt;code&gt;extends&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Greetable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Greetable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hi ${a.name}!&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;greet&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;André&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WANT MORE?
&lt;/h3&gt;

&lt;p&gt;We just went over the basics of TypeScript, go to the &lt;a href="https://www.typescriptlang.org/docs"&gt;official docs&lt;/a&gt; for more!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
