<?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: Orta</title>
    <description>The latest articles on DEV Community by Orta (@orta).</description>
    <link>https://dev.to/orta</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%2F163069%2F32c648a3-b634-4322-bc58-95e645296b35.png</url>
      <title>DEV Community: Orta</title>
      <link>https://dev.to/orta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orta"/>
    <language>en</language>
    <item>
      <title>Type | Treat 2021 - Wrap-up</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Sat, 30 Oct 2021 14:31:39 +0000</pubDate>
      <link>https://dev.to/typescript/type-treat-2021-wrap-up-loo</link>
      <guid>https://dev.to/typescript/type-treat-2021-wrap-up-loo</guid>
      <description>&lt;h2&gt;
  
  
  Type | Treat Challenge Wrap-up
&lt;/h2&gt;

&lt;p&gt;That's all the challenges done! If you missed any of the challenges they're all available in &lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a"&gt;the Playground here&lt;/a&gt;. Let's talk through the final answers to day 5's challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yesterday's Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;In this challenge we were working with an existing object literal which had been &lt;code&gt;as const&lt;/code&gt;d. The goal was to use &lt;code&gt;keyof&lt;/code&gt; and &lt;code&gt;typeof&lt;/code&gt; to extract interesting sets of strings from the object. The first being the keys in the object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- type SchemeNames = "background" | "textColor" | "highlightOne"
&lt;/span&gt;&lt;span class="gi"&gt;+ type SchemaNames = keyof typeof scheme
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Idealy you might have noticed the 'key of' in the comment, which could have led you to &lt;code&gt;keyof&lt;/code&gt;, from there you needed to re-use &lt;code&gt;typeof&lt;/code&gt; to extract the type from &lt;code&gt;scheme&lt;/code&gt;. This gets all of the keys from that constant.&lt;/p&gt;

&lt;p&gt;Next, we asked if you could improve&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;possibleSchemeItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&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="nx"&gt;keys&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, you can switch &lt;code&gt;string&lt;/code&gt; to &lt;code&gt;SchemeNames&lt;/code&gt; - this example was made so that there was an interesting function to play around with. You could switch &lt;code&gt;colors&lt;/code&gt; to &lt;code&gt;typeof schema&lt;/code&gt; but nothing you do around &lt;code&gt;Object.keys&lt;/code&gt; would keep the types retained. This is kind of interesting, the reasoning is that TypeScript cannot make &lt;em&gt;reasonable&lt;/em&gt; guarantees that the return value of &lt;code&gt;Object.keys&lt;/code&gt; actually &lt;em&gt;is&lt;/em&gt; &lt;code&gt;keyof typeof colors&lt;/code&gt; (because of JavaScript prototype chaining) and so you have to re-type that line. Interesting.&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;possibleSchemeItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;SchemaNames&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;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;SchemaNames&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;keys&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we had you figure out how to get the values of &lt;code&gt;schema&lt;/code&gt; as a union:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- type PossibleColors = '#242424' | '#ffa52d' | '#cafe37'
&lt;/span&gt;&lt;span class="gi"&gt;+ type PossibleColors = typeof scheme[SchemaNames]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We tried to be quite explicit in the clue leading up to this one, because jumping to an indexed type might not be instinctive for beginners. This we considered to be the trickiest part of the challenge.&lt;/p&gt;

&lt;p&gt;Then to wrap up the challenge, and to make sure the types you are creating are constructive in a real world-ish scenario, we presented a &lt;code&gt;Record&lt;/code&gt; to see if you knew that the first parameter can be a list of keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- type Scheme = Record&amp;lt;string, string&amp;gt;;
&lt;/span&gt;&lt;span class="gi"&gt;+ type Scheme = Record&amp;lt;SchemaNames, string&amp;gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which would cause a compiler error with &lt;code&gt;previousScheme&lt;/code&gt; - letting you know it worked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEDEHsCdQFwBYFNQAkCGAbTkDuSkA7UfJAayIBMAaUAT0gFcByANxUqQGMBLTy+JFBcE6QgHMUiJACgQoAM5I4oSADNhkHNAWg1Mek1gNGsfACMFPOFKHmUCgA6RIZOvGQBbJJRlywAOoIPJgoJszQKMiRtCagnuju6Lr42KDoXCqYPBTpoOIuAgpcTHD+6YQCPJ6O0JDsHiglnObJKLjBoYYskaDRSABcfiWECirFXigAvKAA3jKgi6CtXGTidYyVA6DMAMQATAAsR0fM1AtLNgAecADCWjDbe2pq6ACs+5RnF4vB4gjZf5wADyhEGO12XHQaiQAGYAOzfJZ9Hj-QEIOAAFVwkCeuwAnEh9gAGF7MGQAX3SuhGYz88gAklkXGRdNlciZYHA6I52sERKBIrUkEpCHBdFhMKBnAorOYuuUStpdDxdKVVBpKOgbLQocQ4iIxJIPKr4DzbKByvZhJFtT5QJQeJFMph3Go6p5GqAKHQ1RoAAYTJDef3pcz1JAAfj83N5oAAyiJg+gAHLoby6GY+9Rm3k5oPeelgJmgHCuNk5KT9Zi6RCmxhKNSMKVNwiZHiQYj+mVy0KJyZM4MKf3lDo8AU45sCSJwUzEaSgQjpkUar1Koy6cyMFTWQXKOcS8pjaA8CQS6DQRIAOlAtzE3VA1VqEZNCmjMlb7c70sgsp48qQftgyQQdPAUAAKdcdG2MQ6AASm2ICEjTDMAG0AF05h+TRRhUH1M1AYFzAAK24OAr3wyCHh0ODqQTJNkOXBQMOwmc529JBfUpItQAATSYRRnDgGwBDESBpFgKElFXe9Si1ETFDgE8JFATYO0IXUxHKA1QnvOtdEYRxBGWdwyzIU9xHSFQF1jFB8wY9AKl8eRpGIU9OCuCzVGs5Afz-ADFAcxcmPfFzzVAAAFX9eyQe5lVAGY9hOY5DmYUAAB8IRed5PjSzK9ihGEEXJWzIui-9QjimACNs+zJlQ7MNFqjQCyQdC-HKFM8A8bVujYJpdLBARDMaaTbIUWIBNwMRrKEBIKCPUwq16iSkBrPISkcdwcwXGBUVPLBAsmRSQildANkqK9yjvfUBPmhwlp6nyUG7SJWA7BskKQUN7BwXATrSUQFHKBcFGXDjfTohdAwY77VKM9Bw3Yd9Sq+hLQAAJW4GBKAAHiQ1MmNoY8LIAPgAbmGTsxmlN6PoUL7ENh9H5mRFY1guyg8QARl5vmkUuJAbiq6A8S4AA2YkAA5iWJAXflRAFFZBME8Vl8XWm574KXJoA"&gt;Our answer&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;For this challenge, we started with the type we wanted you to write, and then tried to find incremental steps which built up in complexity till you hit it.&lt;/p&gt;

&lt;p&gt;The total change we were looking for was 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;function&lt;/span&gt; &lt;span class="nx"&gt;handleSale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Books&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;void&lt;/span&gt;&lt;span class="o"&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="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;To:&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;handleSale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;events&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;Book&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;Books&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;`on&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;]?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Book&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;void&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Getting there is a bit of a jump!&lt;/p&gt;

&lt;p&gt;We first asked you to switch the &lt;code&gt;string&lt;/code&gt; in the &lt;code&gt;Record&lt;/code&gt; to be &lt;code&gt;Books&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- function handleSale(events: Record&amp;lt;string, (e: Books) =&amp;gt; void&amp;gt;) {
&lt;/span&gt;&lt;span class="gi"&gt;+ function handleSale(events: Record&amp;lt;keyof IncomingBookMap, (e: Books) =&amp;gt; void&amp;gt;) {
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next step was to remove the &lt;code&gt;Record&lt;/code&gt; and replace it with its underlaying mapped type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- function handleSale(events: Record&amp;lt;string, (e: Books) =&amp;gt; void&amp;gt;) {
&lt;/span&gt;&lt;span class="gi"&gt;+ function handleSale(events: { [Book in keyof IncomingBookMap]?: (e: Books) =&amp;gt; void }) {
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;?&lt;/code&gt; being the key that if you searched the TypeScript documentation for &lt;a href="https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#mapping-modifiers"&gt;"mapping modifier"&lt;/a&gt; you'd see the documentation around &lt;a href="https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#mapping-modifiers"&gt;mapped types&lt;/a&gt; which we also improved in the process of making this challenge.&lt;/p&gt;

&lt;p&gt;We thought that could be enough for some folk, and that was a good pausing point and thus classed the final change as a bonus. That jump revolved around using key remapping via &lt;code&gt;as&lt;/code&gt; in the mapped type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- function handleSale(events: { [Book in keyof IncomingBookMap]?: (e: Books) =&amp;gt; void }) {
+ function handleSale(events: { [Book in Books as `on${Book["genre"]}`]?: (e: Book) =&amp;gt; void }) {
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;IncomingBookMap&lt;/code&gt; existed specifically to add the prefix &lt;code&gt;on&lt;/code&gt; to the genre of each book, which is handled by template string literals. All of the documentation for these concepts are in the same page, so after a few reads it should hopefully all make sense.&lt;/p&gt;

&lt;p&gt;This system is &lt;em&gt;more or less&lt;/em&gt; how the DOM's event system works, and is what the idea is loosely based on, &lt;a href="https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/008041c9638d034fc2cb366994c9bd79a43fac36/baselines/dom.generated.d.ts#L4549-L4563"&gt;from &lt;code&gt;lib.dom.d.ts&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;DocumentAndElementEventHandlersEventMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;copy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClipboardEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cut&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClipboardEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;paste&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClipboardEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;DocumentAndElementEventHandlers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;DocumentAndElementEventHandlersEventMap&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;listener&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;DocumentAndElementEventHandlers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DocumentAndElementEventHandlersEventMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;AddEventListenerOptions&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Roughly translates to english as "DocumentAndElementEventHandlersEventMap" shows how to handle &lt;code&gt;document.addEventListener("copy", (evt) =&amp;gt; { ... })&lt;/code&gt; and what to map the first argument of that function to. The DOM types can't really switch to use a template literal because not all properties have an &lt;code&gt;on&lt;/code&gt; prefix, but it's a pretty logical expansion of the idea in specific cases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEE0HsFcHICcCmp7QHZoJZoOagIagBGkkA1gM4AWkADgDQFoAmoz082eAEvgDZ9IAd0SI0oAJ4wAUCFBV8AN2SEKtRAGNM-UADNI8eQfgHipSsXwVErSOJpDQAW3xoJoHDQoAXCrLDeVIhIBCHYoIHIJOQAdNLS2N7BuvgayABC5qAA3h5iSABcoD6cuIz4tLR8EgAimBQaMGjeRQAUzPWN6C2gaNBORMEAlKAAvAB8oIqQmKygAL4A3PFyAGKmFJhOVZha3hKMIrACBBQU-ciRIfghdtURQpB5aEgUjETQ3v6gs4j890dWHxMGRLk98MxWFZnK53NDaJAzpgiHxkHx8ElDMxhOJIqBgWhEHEEs1kqlkNxjAZMuRQIgAB5JFgUUA0sg5Z6FUAAIho8BM8G5jE8iO8AGEmj0+gNgoxFLtvFsKBLukVpYNDPMSZiUmlQAAlSAuNBpNl0xliZgss25HD5RBFbkmY1pIWgWgmbz4HB2ereABy+CcDuK3lKeC10n26lZ5hZo1AlP51KyAB8DUbXKbzMtvlBoKAhK5vBEngoWKiIkFivxkNBNrgmHTlM0ALQUCQ+RBOQ5UXZUfFx-Eg5CwOwAbTtL0QAF0xpNWtEyENYHE5AAVJ4uUGSGCGYG6ZB-Tay3cFhTKAgw2igSC6KtHlu+UsPzCGJcs7xPSJv5tiEtoEGDorAEEgxgAkiaRpcGyACyFRjDk3ygLeaB8gKRRJgKbLLHIKF2M6WYhoaLqIDh3yRnI+aGIgT7FJ2SROIO5AssCO6BPU7yfIWQTiFIBY+DcJZfgQGhpGcD4EJCmCKnYOi6JgiB8Fa3x2HSqQDlOITrmBiAAMoaJwtAloJ8DPiJOCYJewQChQMSgOuCjeLALJoJAJY4EgGIFPE5bMKiem1q02TSPhaFUvAi7mCMIUoShS4xBUVS1J0kpRbEIo+F0zSgAAVKAACsQyhQs9DSPMIwgYmwSIC5km6OgGiyeIQhBCE-HHHwxDINiXCSY88BkIwGiuGeoCNGgyhmVW9R6I1zUvn5lbfLQVgNnggQmNAniSY0-KaMJukvnie1IE1c0ms19kAOq1SEPp9SJYZwiwhYGOyakyT8JpIMGzT-AcxSQN82JoLAJaHkpw47vxvSiKwIkAFb9DeImEOo8CHudrgUCIhgSIg3jEg1l2YGpS36UFtH-hQRS5OOZrhGyLLQgABnYAAk2RsuO3JaYg3IzvMrMzgA-G0IZsiMExTDMrAVUhKFyLdCDIJgOBueGklbFU3b-hiZPiMwhP4JgfAsvohgcRb82G3EStgLBfxYGUkl3O4CJIiiyADeysOEjYL7Yj8LLhHirPU80FCs+6NxBgQJDKHEkb+GAelJDeACMVViqNsPbsgrMU4FqIxyTTWG6h9ypGkxmgOz4XJvAMeuKwDeESaiAtyyoKdqL8QD6noDp4gN4AExVf6whVhi9d2O5bUx7Np0Hfc8Cm+tTY2QYjCwyN4i-ZAl4ycScgAPK4k5xTQEQiMHcNecwDCO5F63AW1i3YmjyWdjIHekleS6uXBagw+r4CINYZootQDrBovSIMutGCcE8ABYQ3xYYXjBN9DQfBoDGzni8TMncY4fBLF9bEiBXILy4PZTc7poAnGtreXQ94Or3RmI2ESAcEZPG+AXIGwZ3RIG8PsC6zAgL-S6hocsdpPzfmrNGP+94I5PmjqcM8nU4aB0IC4SofUnCQA6ApYIp8wDrkwLQIoNQ7Dg1APWQuAAFIS2g+Bl1MNbYkg8h4jxvAAZlAJPaegRZ54mAYbFmIRrAlmgAwH4zlPxbCwX2YS1YXDhA9JAb2Tgih4kUX4OQltJKsyXEvNAmx8F-GkRdCualuFyO6pYawthL7IEAoI-+eJI5EwCXIXOfEn6rQksEshaBLYuAWptGAO1cm6X7l4kCYBMh9FpsPDOoAAAsATvh9MLMgQ+l48TcL0KYVmkFGhOBguYeCtAW6MMgHaK4SClISD6hQSAqJ7hqVZszGOIlDJ-CSJJPJ-cqIwE0UckS9iBGXG7FUDEyASj6NcBYhhBs1IiSEOvG8MTJL-jfMgMJdhiRAA"&gt;Our answer&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks!
&lt;/h3&gt;

&lt;p&gt;There are a few people involved in getting &lt;code&gt;Types | Treat&lt;/code&gt; running whose name you don't see on the masthead: &lt;a href="https://twitter.com/NoWaySheCodes"&gt;Gabriella&lt;/a&gt; and &lt;a href="https://twitter.com/drosenwasser"&gt;Daniel&lt;/a&gt; on the TypeScript team, and the folks in the TypeScript Community Discord - especially &lt;a href="https://github.com/webstrand"&gt;webstrand&lt;/a&gt; and &lt;a href="https://twitter.com/M_Rutter"&gt;michael&lt;/a&gt;. My wife, &lt;a href="https://github.com/dangermcshane"&gt;Danger&lt;/a&gt;, should probably also get a shout for helping to provide themes - we've done 40 challenges so far and have to dig pretty deep occasionally to be fun and topical.&lt;/p&gt;

&lt;h4&gt;
  
  
  Feedback
&lt;/h4&gt;

&lt;p&gt;If you gave &lt;code&gt;Types | Treat&lt;/code&gt; a shot, we love for you to run through our &lt;a href="https://www.surveymonkey.com/r/FSQ7DLC"&gt;6 question survey&lt;/a&gt; which help us figure out how to change and improve. Feedback on Twitter is useful, but there's only so much context you can gve in 280 characters!&lt;/p&gt;

&lt;h3&gt;
  
  
  From here?
&lt;/h3&gt;

&lt;p&gt;If you've not done &lt;a href="https://www.typescriptlang.org/play/#gist/303ebff59a6fc37f88c86e86dbdeb0e8-0"&gt;the 2020 &lt;code&gt;Type | Treat&lt;/code&gt;&lt;/a&gt;, it's also good!&lt;/p&gt;

&lt;p&gt;If you want to challenge yourself further, check out &lt;a href="https://github.com/type-challenges/type-challenges#intro"&gt;types-challenges&lt;/a&gt; this clever system of type challenges goes all the way up to "very challenging for the TypeScript team" and also run entirely in the TypeScript Playgound. It's great work.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Type | Treat 2021 - Day 5</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Fri, 29 Oct 2021 19:59:59 +0000</pubDate>
      <link>https://dev.to/typescript/type-treat-2021-day-5-1mlo</link>
      <guid>https://dev.to/typescript/type-treat-2021-day-5-1mlo</guid>
      <description>&lt;h2&gt;
  
  
  Type | Treat Challenge 5
&lt;/h2&gt;

&lt;p&gt;Welcome to the fifth, and last, &lt;code&gt;Type | Treat&lt;/code&gt; challenge! These challenges are a series of blog posts which have 2 code challenges in, one for beginners and one for intermediate TypeScript programmers. We're on day five, which means going over the answers from &lt;a href="https://devblogs.microsoft.com/typescript/type-treat-2021-day-4/"&gt;yesterday&lt;/a&gt; and have 2 new challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yesterday's Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;This challenge aimed to be generics 101, first introducing the concept of making your function pass a type from the function to the argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-  function getBowl(items: any) {
&lt;/span&gt;&lt;span class="gi"&gt;+  function getBowl&amp;lt;T&amp;gt;(items: T) {
&lt;/span&gt;      return { items }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;any&lt;/code&gt; acted as hint clue about where to look, and this example is almost the first code sample on the &lt;a href="https://www.typescriptlang.org/docs/handbook/2/generics.html"&gt;Generics chapter&lt;/a&gt; in the Handbook, so it felt like a good intro.&lt;/p&gt;

&lt;p&gt;The second part involved understanding &lt;a href="https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-constraints"&gt;generic constraints&lt;/a&gt;, these are essential tools in helping you define the baselines for types which can be used in your function. In this case we didn't provide the word "constraints" but opted for a more cryptic clue by setting up the function most of the way, then saying you only needed two words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-  function fillBowl&amp;lt;T&amp;gt;(candy: T) {
&lt;/span&gt;&lt;span class="gi"&gt;+  function fillBowl&amp;lt;T extends string&amp;gt;(candy: T) {
&lt;/span&gt;      return { candy }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By saying that &lt;code&gt;T&lt;/code&gt; extended &lt;code&gt;string&lt;/code&gt; then the string literals are correctly passed through the function - which removes all the compiler errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEE0HsFcHIDcCmoDmkAuoCeMBOBnRAGwDNQAjaAOwGMALUSM8yAdyP0bJoEMqATLABoK0TOjrIW7Tj1zIAUCFAAraPkwAiFIiqJcASxqaKbDgDoIMULyqgADmNB8sEg1RSh3oCYgC2Inz8qIiYLm4eSmDkPDQA1oxOTD6SfpYKCiTUNOgGkHY66ABCZgA8ACoAfAAUBuj++ABcoOUAlKAA3gqgPaDy6NC4dh1e9X6cAL4KUwo0+Ro2kqxYALIGAB4l7KAAvCHFZtUjc0SQBM0A2pry-Joi2vK6d6Ca5ETQiJoAuiIauDyscj6QyIJovfCQPyfUATVpRXo9AB6AH4MnMqAtbPwDIh+ABBez2IigrZEXb7UlHHxYeygy6acp8FB0aDvZ6aFY8ADnAGPQPxIM4-Gd2eUmCREMgCUTQd8YXDlAjQCiMspynQDJxNc5QPg6DwoSIgbx1MgDPxEDwiEQsCltawYERgv9NcgeDZIfYDMTcM5cLgzo00UEcfjCcT8KTzHUGuZ0DTEBcAAxfVVgADCfGw1giCWS7tYPFt6EFxPEkgccgNoX0XFAAANCqT66A4pL7ClkPHaaB4cl6zHxi2JAHoMzO6AsrRcvlURl5wv4QBleyQb36ThA06sZyySu4TDJXygRDreoYvJ2I8azing0yxcL5RL3LWnXkOqTwa+X0kM4pSBCEYOwiDkHRdRoR4MUfeF00gSAiBEH8zUwTVF2UKA4CQVAMGzQZCFIURaAYZJpA4OssWEURyykMxZHkXtlDUBZtF0fQjBMMj8EsTDUH+cgdQlHcSD4GhbXIf4BFxUBGnQPxmi45wBHhEhvTJY9FNYOoGF8AxfUo8wMinHJL0nNTSQqE8z10fhOD+dwUBqSjmjaTpul6fpBmGGwgltKYZnRBY-DkSMzHJVTrUpTRgoITQ4UCzB8CoIw2wIUlwvMw5NCSlKNzi2Z5kSuI6nQCN0r2CKiCi-BivQUrZTheEAElxC8zgYHLHgwknRAd2K2y-WQL14mLOgYGZIR4SCYCbVAQsqHEQVCmArsEzrHyBFtEgAz8E9YgYMjDIKjFMBQAwkAAeTEJdkviDdyWqP5mmy27UvwOLdkqToYWOhYzsu67avqzg9ke9BcGemqSojD6di+kYpgS1BzsQK70E5NKQoep6Xhi972jh76ZjVG9QChPhOBwaA5rU0A9GkksrPPYJj3rSrmx8SB4X1ARiUrfB8AcnV8FpGgDFUmhdXBoWiBjf51LoUdx18eFj2MmcqB46wtLffJZvplnBR4fgWYdOazgGxnVYrdXTMZ4K2ztTgHVwOIjv+1HrtejdHu9tKzHMSi4Q9tGlyBiNHvDkkA6DhQQ7EDHIxC6o8ajWOMiAA"&gt;Our answer&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;The intermediate challenge also invovled generic constraints, so if you had just finished the beginner's then you were in a good place to figure this challenge. The key is to make a&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- const check = (data: Competitor[]) =&amp;gt; {
&lt;/span&gt;&lt;span class="gi"&gt;+ const check = &amp;lt;Type extends Competitor&amp;gt; (data: Type[]) =&amp;gt; {
&lt;/span&gt;      return data.map(competitor =&amp;gt; {
          if (competitor.weight &amp;gt; 2121.5) throw new Error("Stop the show, world record hit!")
          return { ...competitor, judge: (...args: unknown[]) =&amp;gt; { } }
      })
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is testing a few different things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing generics with an arrow function&lt;/li&gt;
&lt;li&gt;Using an &lt;code&gt;extends&lt;/code&gt; constraint for the interface subtypes&lt;/li&gt;
&lt;li&gt;Re-using the type parameter inside the array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We left a tricky problem with this challenge, but explicitly didn't call it out. The function &lt;code&gt;judge:  (...args: unknown[])&lt;/code&gt; is a types gap. There is no validating that the judge function actually works like expected. There are two approaches for handling this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- return { ...competitor, judge: (...args: unknown[]) =&amp;gt; { } }
&lt;/span&gt;&lt;span class="gi"&gt;+ return { ...competitor, judge: (...args: Array&amp;lt;T[keyof T]&amp;gt;) =&amp;gt; { } }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This version &lt;a href="https://twitter.com/faridz974/status/1454107977267417089"&gt;from @faridz974&lt;/a&gt; would ensure that the right values were used in the function (e.g. you couldn't accidentally put in an object to something which could only accept &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;number&lt;/code&gt;s) but it ignored the order. An accurate, but whole-heartedly not recommended for production version which does take order into account comes from converting an &lt;a href="https://github.com/Microsoft/TypeScript/issues/13298#issuecomment-707369176"&gt;interface to a tuple on GitHub&lt;/a&gt; which is a bit too long to print in here, but here's a &lt;a href="https://www.typescriptlang.org/play?#code/PTAEE0HsFcHICcCmoCWA7UBjAFgQ3gObKQBmo80aa6BoADtALZ0DW65uALjVpM4t26Q0AZwA0oAJ4xQeAG6IAUCFC5QJRAHdQnSOUqq0AEykxYC0ACtoIzqAKQ7nbMhEoAXskx86AlEIxNSHg2NAIAOkVFdE5EeBJcTGQAYR8-XXhQAG9FUDzQYAAqQtAASQwAGwAjEVBC4Fz8zUQUAmxOAC5QNCYquIBuRQBfKJi4hKTQAGUPRFT+QRRhUEQAD1jjWvnfQWDs0BHotFj4xOQAEURveC4UBW30pYw1jaMttN3MnPydF0ZELq2eA0YZRFQAFWwKFq3jQCngnFquAw+Cq-hu8EkoEgVUsV04AFosZxJL5UMc9GpONA6BVEOFQMowO1OHQRB0QAR-NhoFVwt5GMAALIoTDwSAiUicYDg0mIKZilB0aXQkTQRAiYAARgAzAAmACcAA4AMSq9UC-7HAkAdgADDadQA2A1am1OsFgKDQUCMVrtVQiFigTTYLFGSAanSWSwkOQobqOchXPhWkw2HjOaHk+jiozQTABAD8ntAkOQ4ugbXs0Ls2ecXF+yAA+sEjHFm9iyM5kNTachs2gkwRoPhkbFECYqliqo5sEzQAApXByXAK4HKwwmZw2VQVSWgadluXrpWdKIkskANVwFXV4JpdIAPAB5CTglbrRCbUAsRDSMgX1AABeX9-1IUAXwAPhA0AAApGjyBCfh+ZCUPQj8Xm-N5DEkRD0IIot4M6MsAEoQJg8F8IIlCujQRB4Wo-JyKwn90A0TIAFUmPQoi4M4z9XiRNA8Jomi+OgLpOPI4CYORUSxPQuiGLiHiUJYr8fzguQunYuJQCvGS5JEtTxIM0yCOUxjFLyKzVJ+DShPg5sunkozyQ40AAHU1KIgBtcJApvO9EAfftXwkABRVZMDvdsn3BCQvKgqCJBfPzos4G5CyfLyJD-ADIKggBdYq1K6PyytIwYolhWwsBcTBg1Ap9kkE7D3gWfxgiguCjC4XAumSSr3O+fIkGpeAMH6zhcHCRhcDoOCBR2brMlk7I1JQMhlo+Nbwmaf07BgvUtVO8IAFZyOccVtHo7RIvgcV4DggAiKZdDoJtQBEbBIE0CQgngCoTCQa4TChTgAEJXtItSJugKb9kC-k9oyCRrCMIgujglH8AIdkDNve9H0QVqoNGg4DnwoY4cOOq7DcTwHk+WpQL8rIQxaNoSNOg0DgkTnDp5rozrtAX9mF9pRZ1d0JaF7npdAPUdQOMqGdAdtrlue40eCNnQA5pt-i6V7GEgeMNVewHFZIp1VaGQXjYBUBXroYIstwfxra5o6ugAFn9tXS3LH7Zl4LqAhDYIWFqAgkC4WrhHqpm5jRp5YJwK4WDg1OWbWkQ4ZUfIAD0Szz9PhHCEhgkixJsF2yO9g2sa8hW9JgnCTGiEb1aMgO226bhhdQ614Ida8SuMGhNBYDsOhcBENwwm+y9EAJLOmt+GA2iT0Q7DHm5uF1yOM9Azec8Pif84yQuF1LktFCv4+09Pqua-gOucF7jv1pg1uI5907t3RAP9PgDyOhIdu4Cez-AkHaIeiggA"&gt;working implementation in the playground&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?&amp;amp;q=2#code/PTAEE0HsFcHICcCmoCWA7UBjAFgQ3gObKQBmo80aa6BoADtALZ0DW65uALjVpM4t26Q0AZwA0oAJ4xQeAG6IAUCFC5QJRAHdQnSOUqq0AEykxYC0ACtoIzqAKQ7nbMhEoAXskx86AlEIxNSHg2NAIAOkVFdE5EeBJcTGQAYR8-XXhQAG9FUDzQYAAqQtAASQwAGwAjEVBC4Fz8zUQUAmxOAC5QNCYquIBuRQBfKJi4hKTQAGUPRFT+QRRhUEQAD1jjWvnfQWDs0BHotFj4xOQAEURveC4UBW30pYw1jaMttN3MnPydF0ZELq2eA0YZRFRQaCZbxGZBBEK1AhILigTQuDDSaAouLENAVSSyXDGCo8bwLfxPETKMC4KowJwuUBuTygUiqehMVjsKrQOyoxDomS2fCxEy6AlEry4ESIWrElhKFTOZAw663Zaknbk4S1AC0pkxJBgxl+yOcyIxoCMKCMaFgdnkyCpv2QNJQxM4+LFiSSIlqIj4xDISpW6xu6hQiAqb3URpMy2DTsuqu49w+WrQAEJQMlCfqQ69naAAAY4K4sIvqSiYAKgPoVSCaJ1ipCMSAWYMat1xFbweB7OsNgD8oCi3lEdlLmBYoAAvKAADwAFUkvnz-OjD0+AD5QAAKIxcXBdZe+ADaAF0AJSznfffJITiQjAHzi4cKMXB0Xca9J7Ge3xofjyFAyG-NMMnCZpWnaUAdwAJgARkQ8IAFZr2cPttDQLRQAAUV7YJdwAIimXQ6ELERsAbCQ4SjcgrmCExsH8DMiMvQCgIfJ99nCXif0+CRrCMIgul3XjwnwAgRC6SgWDQBs0Ava9-32IYDg4oZ2MOMdbEZWZN38YJajnU8sixaDOlARCAE4DgkMyoLaSykIABjs-ZHPaLoEIAZgAdgANnchyWicro4J8g5z0UHS7BVYJblTMkMmM0BTOdf4uiI1s5AjEQiJo0KvNAALIqGeyMoBUAiLoYJOBufwCvMsLQAAFlaqKwTARcGSZLxwKeFFghYBEkU4UdtTsPqDJrOdJxYXdpvAoz2JUfIAD1B0UJbkqecJDXgXDEmwMDkr-ACfn4wz4HCISiFOzUIM8zgtPYp0euVBibhTfrduWFARFtOw6ClNwwkLD1fB1ebfhgNoJvHS0vsSuYBuWOaXCnfdkZ+maVqdDatsUeLvruVG-rQfbgiOnAHt-TIVLvPIrogu7EDpz5IKKzgJBZ4JwiVf5XsUIA"&gt;Our answer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-17"&gt;Update your website's color scheme for Halloween and tidy the codebase up a bit&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-18"&gt;Handle a book stores halloween discount event&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Share Your Solution
&lt;/h2&gt;

&lt;p&gt;Once you feel you have completed the challenge, you will need to select the &lt;strong&gt;Share&lt;/strong&gt; button in the playground. This will automatically copy a playground URL to your clipboard.&lt;/p&gt;

&lt;p&gt;Then either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to Twitter, and create a tweet about the challenge, add the link to your code and mention the &lt;a href="https://twitter.com/typescript"&gt;@TypeScript&lt;/a&gt; Twitter account with the hashtag &lt;a href="https://twitter.com/search?q=%23TypeOrTreat"&gt;#TypeOrTreat&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave us a comment with your feedback on the &lt;a href="https://dev.to/typescript"&gt;dev.to&lt;/a&gt; post, or in this post.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Resources for Additional Help
&lt;/h3&gt;

&lt;p&gt;If you need additional help you can utilize the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/intro.html"&gt;The New TypeScript Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://discord.com/invite/typescript"&gt;TypeScript Community Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The comments on each &lt;a href="https://dev.to/typescript"&gt;Dev.to&lt;/a&gt; post!&lt;/li&gt;
&lt;li&gt;Our previous &lt;a href="https://www.typescriptlang.org/play/#gist/303ebff59a6fc37f88c86e86dbdeb0e8-0"&gt;&lt;code&gt;Type | Treat&lt;/code&gt; 2020 challenges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Typing :)&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Type | Treat 2021 - Day 4</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Thu, 28 Oct 2021 19:20:37 +0000</pubDate>
      <link>https://dev.to/orta/type-treat-2021-day-4-3iie</link>
      <guid>https://dev.to/orta/type-treat-2021-day-4-3iie</guid>
      <description>&lt;h2&gt;
  
  
  Type | Treat Challenge 4
&lt;/h2&gt;

&lt;p&gt;Welcome to the fourth &lt;code&gt;Type | Treat&lt;/code&gt; challenge! These challenges are a series of blog posts which have 2 code challenges in, one for beginners and one for intermediate TypeScript programmers. We're on day four, which means going over the answers from &lt;a href="https://devblogs.microsoft.com/typescript/type-treat-2021-day-3/"&gt;yesterday&lt;/a&gt; and have 2 new challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yesterday's Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;I wonder if we over-indexed on the difficulty here, and we're interested if you dropped off somewhere through this task because we had less submissions than usual for this challenge. The goal was to have you build out a &lt;a href="https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html"&gt;template string literal&lt;/a&gt; type which accounted for string input which &lt;em&gt;roughly&lt;/em&gt; matched how CSS's stringy variables worked.&lt;/p&gt;

&lt;p&gt;You started with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which accepts all possible strings, next we show some examples which should always fail. The key one here being that an empty string should fail: &lt;code&gt;""&lt;/code&gt;. Next we provided some valid input for you to work with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;in`&lt;/span&gt;

&lt;span class="c1"&gt;// Works with:&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12in&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;Giving you a sense that a number can be used in the template slot - which allows for all sorts of possibilities. &lt;/p&gt;

&lt;p&gt;Next we gave samples with different prefixes, so &lt;code&gt;"in"&lt;/code&gt; and &lt;code&gt;"cm"&lt;/code&gt; would need to be handled. To get that right, you would need to use a union:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="c1"&gt;// Works with:&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.5cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20cm&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;Next we threw a curve ball - &lt;code&gt;"0"&lt;/code&gt; should also be acceptable, this is a bit of a curve ball, but also it's a bit of a trick:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="c1"&gt;// Works with:&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.5cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&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 lack of a unit is just an empty string unit! Only one more thing now, and that is allowing a space inbetween the number and unit. This could be done via another type also:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Space&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Space&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="c1"&gt;// Works with:&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.5cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12 cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;14 in&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;That was is for the easy parts of the challenge. It's pretty tricky, because it requires that you understand that &lt;code&gt;number&lt;/code&gt; can be anything in the template string and to understand how a union can allow for different types of strings inside the type. That's all in the main docs, but it could be a lot of ideas to learn at once.&lt;/p&gt;

&lt;p&gt;This challenge also had a set of complications, cases where the version of the the &lt;code&gt;Length&lt;/code&gt; type we expected people to build would provide interesting edge cases:&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;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="mf"&gt;0.3e21&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;cm`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-12 cm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kc"&gt;Infinity&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;cm`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;cm`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;b&gt;Click to learn about these cases&lt;/b&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;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="mf"&gt;0.3e21&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;cm`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Acted as a potential clue to an alternative answer for these failing cases:&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;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kc"&gt;Infinity&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;cm`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;cm`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Because &lt;code&gt;number&lt;/code&gt; can be switched out with &lt;code&gt;bigint&lt;/code&gt; in the type of &lt;code&gt;Length&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- type Length = `${number}${Space}${Unit}`
&lt;/span&gt;&lt;span class="gi"&gt;+ type Length = `${bigint}${Space}${Unit}`
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This meant you couldn't pass in &lt;code&gt;Infinity&lt;/code&gt; or &lt;code&gt;NaN&lt;/code&gt; but also broke &lt;code&gt;req("1.5cm")&lt;/code&gt; because you can't have point values. This could be fixed via:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Space&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Space&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Which describes both possible cases with a "." and without. This technique still doesn't handle the &lt;code&gt;req("-12 cm")&lt;/code&gt;, and actually, it introduces a whole new problem: &lt;code&gt;req("-12.-12cm")&lt;/code&gt; is allowed!&lt;/p&gt;

&lt;p&gt;We spotted a good answer from &lt;a href="https://twitter.com/danvdk/status/1453503071087169536"&gt;@danvdk&lt;/a&gt; which revolved around using string manipulation instead, by introducing a &lt;code&gt;Digit&lt;/code&gt; type:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Whitespace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Digit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Digit&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;|&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Whitespace&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&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;This solution correctly handles the case of &lt;code&gt;req("-12 cm")&lt;/code&gt; but via that &lt;code&gt;number&lt;/code&gt; would allow something like &lt;code&gt;req("1-22 cm")&lt;/code&gt; - which you can pretend is to handle an input range.  It wouldn't be hard to take this solution and reasonably cover additional edge cases. Very cool solution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEE0HsFcHICcCmoDul4GsCWA7A5qJDqAJ4zyjQBGi8AtAGbp0AukWANoi3QA4CGvWrjx1+dABYwAzsmkt+8FtF4AoEKH44AJqCGReXUBkSJeoPFgBuI0jFA4isnLNBd8LCdNBMKUlKAAttAAxhKgbJzc6mACQhSeiCSaSBbs+BGQDqbaAHQQ9rhYLFj8HBzJePxWyImguLzQLJoxbpDNkAw+XAAeWFScxSQANKBUTT6IHM0cWCZB-CQ0oAAG8vAiK-Xe-GPFmVmtwWE+SIjakIH5qq1QcDWgEoiKup0RiIGG-CzIsz-wZWko0Ci2WiWSIRgHF0y2gsgY0A4AH4biwSEJQABVHD7AC8oAARCFAgTQAAfQm4UkUgkE1RojEAZQEIWQ+NJ1MJdIZyAAMogPOF8SsACQAbxw0ECNHgAF9xcz+Kz5WLscVZSsbho7hQAIIABQAkj5oDgQiUiKMUIhYOUxsg4bY6g0JmwIhIsN4EWaLThWm6rGUsNpvsgsF0yNAEuiw94NngJB0KI4WDdveasERQEgAI4AChdLAAXKB+YKAJSgMWqUC10AaABKH0gDwAcvxW8DcHDQIGONBEEDQDW6xoACJZaSXZBoTCqWVasAAFSyeG4oHkih+2lGTyQsG8U8CyEQPX4ny43hQHpO0ikiN0ZRQiy9URukJczTvUO0ADF+JwoD4nmla4gAfFWI65nmtLllBiD5gSgg9AScG1tBBJICSaHZghMH8FQISofOi6gIyChKI8tCIKMkalgKeCeJk9qaFQRhumEiAhBgPjoJoDhSjKmg6MJlI4KSvBIAwWA9O+ThflgF6IIaOCNCw3jAaBEHVnWuGIQADFSOHoXhBIAIwAExGSRrQAOoSN8rEwM0gToLUDnEEQyCSYg0k9LxCRPLxHAYFeUjurgPG4KAxIoqoH7yKAp4sACarqUBoAgUB2kjiZiFmbkACsxLEbpGEWfpJVwQurSGs0DCmBwcZYAmzSeI54Z2NAej8NI3gEvpBK0fY34PixBHsauWSmsUdCXtIcmfo8WjaFwABatBZJp2WQWVpmDdVpH2Y5BHOZo5SQCgtjXsUg4ssgNAsNaArusgkrSrQwm6HUM0sHFCXNB5q2IPZt3SPdGVZeBu11hhlkxdhuV6TBZkACz1OJh21RG9gOQ8ZQcIQXR1KdDwCH1IijB+eAAupACEoBLg5LAHkEbnuloSWONACb+lkePIJCSnbq9MUOeUDGIPkTOemLBOS8tOwblxSDNAAVKe8TqWrysZkQrS+HoiAGEY15ZEgBPJM+OBtVkPyJYkgSyBwNTSLki0Ox6+DSKDYQAMKXIYWAhKGTOIAAst8-yQ1pMMaDL3iy5zBOXecAkfRQjoZAMlg2w47TfJmOCjMUrMp9aO6gAAVnCzQjhoJM4CmhdZrLM05gOJfaM85TJHRIcsCcOfpzKifEHUABSjLwfmopivpuQAMyIBZZmysSKxwfXYDh923jvaPoAXDgsAufw8zOK40XkDFvU0bfxB0QK0hRu53zb-UHQ4BUmghKyvDpV4JAaQxRrBvUErQaQKI8owToPDKqNxawaDqtsPQwCQFsVqObACrhOa0HgHxK6TFEiuCepAKmnNIwf2kngV+hAJj+CRKAWyyAMCOACG8Mh9QlLHhti3FwowvIbkUoYT6RCJAf05rgf4g4SgZBSvwbudBOgMFGCtYS7Q9yoBvOEJUIQoyhh-iHYgA8TgkMQB-EOsgrzFHvG1ZmEQARKJUe7GBc8VLSRxGidegRN4zzzHPdsrYfF+JqjcIAA"&gt;Our answer&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;The intermediate challenge was on type literals mixed with generics functions. The challenge started with this function:&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;makeTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&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;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;spooky&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/spooky&amp;gt;&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 goal was to keep track of string literals through this function. To do this, you need to switch the &lt;code&gt;str: string&lt;/code&gt; to be a type argument:&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;makeTitle&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Str&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Str&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;spooky&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/spooky&amp;gt;&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 know that the type argument has to be a string, which you can tell TypeScript via &lt;code&gt;&amp;lt;Str extends string&amp;gt;&lt;/code&gt;, then you can re-use the &lt;code&gt;Str&lt;/code&gt; in the return position:&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;makeTitle&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Str&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;spooky&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Uppercase&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/spooky&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;spooky&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/spooky&amp;gt;&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'd think this would be it, but &lt;code&gt;str.toUpperCase&lt;/code&gt; actually converts the &lt;code&gt;str&lt;/code&gt; to a string! Tricky, you'd need to think creatively here and you have three options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use an &lt;code&gt;as&lt;/code&gt; because you know better than the compiler:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;makeTitle&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Str&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;spooky&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Uppercase&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/spooky&amp;gt;`&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shouty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Uppercase&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Str&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="s2"&gt;`&amp;lt;spooky&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;shouty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/spooky&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Override &lt;code&gt;toUpperCase&lt;/code&gt; to support template literals:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;toUpperCase&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="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&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;Uppercase&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;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or create a new function which supports template literals.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This would take the &lt;code&gt;"party"&lt;/code&gt; used on line 19 and convert it to &lt;code&gt;"&amp;lt;spooky&amp;gt;PARTY&amp;lt;/spooky&amp;gt;"&lt;/code&gt;. That change would remove the compiler error on &lt;code&gt;addTadaEmoji&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The second part was about re-using the type parameters inside argument for the function. The challenge started with:&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;setupFooter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&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;// validate string etc&lt;/span&gt;
    &lt;span class="k"&gt;return&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="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&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;Would lose string literals passed in as &lt;code&gt;str&lt;/code&gt;. You knew ahead of time that there were three separate parts of information you were interested in:&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;setupFooter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="kd"&gt;extends&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;Address&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These could then be used inside the replacement for &lt;code&gt;string&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;setupFooter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="kd"&gt;extends&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;Address&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which would correctly set up these variables for re-use later:&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;setupFooter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="kd"&gt;extends&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;Address&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// validate string etc&lt;/span&gt;
    &lt;span class="k"&gt;return&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="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Address&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;Successfully completing this challenge would show that &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt; and &lt;code&gt;address&lt;/code&gt; were not &lt;code&gt;string&lt;/code&gt; but the strings passed in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEE0HsFcHIDcCmoDOiAupoAdQENQAbAS3XUOW0hXUQCdQBbPAa2IDsBzUAI2hQ6IUKADT52AE1AAzSAwAWeQoUgB3RInYAoEKACeMWHWQTIHbimyIAxsSUpQq+ZtBXI2CqEVIvSlepdsPDp0YiEAOlAAFWdeIXQdMGlEPHRoY1BiB3RFTANoJlZkHOLSCgdEAA90OgJLSEgWPQBCLUSIGFB2SFDrRCkc1NBrSAlkJ2JreX1OnJhOeUxVGEIpZboWTIdarPNxdvo6ORkjxmi9KwBlazpibExTVXZ8TBLQAAM8CQkor7wAUUYkAAVsR3pEAJKYNCIRjZXIfZgsRBRMqId7tLLsWCYZGIbB7N7oC7ILJEBoCLigN40W5Uki0WqERzOZ6kYaQRhCTLPAC0oHa1jwz3yhWRmUwQWEvD0w0UXEJsTG0g4pGIkGekGkiKKqPI6IA-G1pNB2NZQhqxSi0QAeS41UBVWiSBy08wAPgAFLSAFyge10ACUfveNvqjT07oAJABvACq2CsdCFaDtNXdAF8bcBw013e9QDGtKASxz2DRUPIYMTQABeVA1cLoSAJpMAYTwaE9gfwDlb9BTiDTdHdxdLxjSdGeodzkdjKCr0GJWZzVAj+a0GbaI3LmGMAEdoMRjChfhIAUDQXXQN6an63Vwe7X3YXQBP0s9aXXa-WAERhtc8wABQAQQAJSicBs1nd1fy3HcKy+H4-kBEFiGvW86D9f8YNAiCoNXBo81-J8X3eH10D+H15xqDMfSCEI9B9DEEMwJCokgIDqEZDDfQbOlOFI18ty0VjUAwHAAAkUjGBh627OsXyLUsywrUJ9WvJFrX1T1fwY4kSLaFTiG1T0DyPE8zwvNDPXUihAx7QsxxUkt2JQy9iFstFA2c0ARJU9jOO4+gvP1HyRN0AAZDBYAcHhkCrdh4jEHIyRQPQaFhGY4B8NBMBwLZ8CIUgNOBYUmnaeKhX4UlMEUbJIB5Rk8HNRxSGmAhmCmQQiBSKc9mwI5OFqRhIhiRB2kGyBhrwM5OGIJAHFFHgWs2AgRkYZheTQBjUn6fi9lkBg3lkHp6ExdgjuYC12EiKACh3JAQmpeQyQ4ZsitOni+EwFVJGyug0EIaR2hUSluGJKweSu1J1WeJwXFFGqXrJE0zRuv1jVNc04fEtJsAAMQaRkbQAOVm5AnU0CRXRqcwxAAET2x1qmp2mBLEEDvhPCpWZdA6uC9Pj3ljcmuQzERYyZ2gJdjLmJB5jN3h7ZTS10eAlGIc9aAF7gMGsXz3ynV9fJU9gKfvRtLAZXSRBIgBtAAGABdXtQDFxARFN0ttcQS26HCa3SFth2AEZXc7UBpc973XO5oQUH9wOPGD387cDe2ACYI4ceWed8rcIrACExj8WUUEawY8k6TgMBe5BbgWV4STixB-G3DUKy++hrzynAibOuhdKZrge4AWWsS55U9yS-DUDRnkzx3M9DkRxtACF2EZJL0EM7uA-Nrl2hcgA9I19-CX3j5Us+tAvpD890U+jS0IA"&gt;Our answer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-13"&gt;Make some candy bowls. Then make some very specific bowls&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-14"&gt;Run a set of pumpkin competitions&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Share Your Solution
&lt;/h2&gt;

&lt;p&gt;Once you feel you have completed the challenge, you will need to select the &lt;strong&gt;Share&lt;/strong&gt; button in the playground. This will automatically copy a playground URL to your clipboard.&lt;/p&gt;

&lt;p&gt;Then either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to Twitter, and create a tweet about the challenge, add the link to your code and mention the &lt;a href="https://twitter.com/typescript"&gt;@TypeScript&lt;/a&gt; Twitter account with the hashtag &lt;a href="https://twitter.com/search?q=%23TypeOrTreat"&gt;#TypeOrTreat&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave us a comment with your feedback on here!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Resources for Additional Help
&lt;/h3&gt;

&lt;p&gt;If you need additional help you can utilize the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/intro.html"&gt;The New TypeScript Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://discord.com/invite/typescript"&gt;TypeScript Community Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The comments on each &lt;a href="https://dev.to/typescript"&gt;Dev.to&lt;/a&gt; post!&lt;/li&gt;
&lt;li&gt;Our previous &lt;a href="https://www.typescriptlang.org/play/#gist/303ebff59a6fc37f88c86e86dbdeb0e8-0"&gt;&lt;code&gt;Type | Treat&lt;/code&gt; 2020 challenges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Typing :)&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Type | Treat 2021 - Day 3</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Wed, 27 Oct 2021 20:25:16 +0000</pubDate>
      <link>https://dev.to/typescript/type-treat-2021-day-3-54b0</link>
      <guid>https://dev.to/typescript/type-treat-2021-day-3-54b0</guid>
      <description>&lt;h1&gt;
  
  
  Type | Treat Challenge 3
&lt;/h1&gt;

&lt;p&gt;Welcome to the third &lt;code&gt;Type | Treat&lt;/code&gt; challenge! These challenges are a series of blog posts which have 2 code challenges in, one for beginners and one for intermediate TypeScript programmers. We're on day three, which means going over the answers from &lt;a href="https://devblogs.microsoft.com/typescript/type-treat-2021-day-2/"&gt;yesterday&lt;/a&gt; and have 2 new challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yesterday's Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;There is many ways to decide how to type existing data, you could use &lt;a href="https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types"&gt;literal types&lt;/a&gt; when you're sure of the exact formats - or be more liberal and use &lt;code&gt;string&lt;/code&gt; when you expect a variety. We opted for literals, but using &lt;code&gt;string&lt;/code&gt; is totally cool too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UnderripePumpkin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;soundWhenHit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dull thud&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RipePumpkin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orange&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;soundWhenHit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;echo-y&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;OverripePumpkin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;soundWhenHit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;squishy&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 second part of the challenge used &lt;a href="https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates"&gt;type predicates (or type guards)&lt;/a&gt; annotates a function which returns a &lt;code&gt;booleon&lt;/code&gt; with narrowing information about the paramters. This means we can tell TypeScript that when the return values to &lt;code&gt;isRipe&lt;/code&gt;is true, then the argument &lt;code&gt;pumpkin&lt;/code&gt; is of the type &lt;code&gt;RipePumpkin&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- function isRipe(pumpkin: any) {
&lt;/span&gt;&lt;span class="gi"&gt;+ function isRipe(pumpkin: any): pumpkin is RipePumpkin {
&lt;/span&gt;       return "soundWhenHit" in pumpkin &amp;amp;&amp;amp; pumpkin.soundWhenHit === "echo-y"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Successfully completing this challenge would have no errors, and the type for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbwMYQgawAoFdxuAOwGUIswBfOAMyghDgCIYBPMAUwFpp2YpWBDGPQBQQgPSi4ATRIByXnAAWrADZgCAczgl4AuHzjKISPsqqoAJuwBGffGjg8mGhxDgBnaDrESrwTWuVWLUo4MBwwPHw3OAIYVw8QVhgFZwB3FKQFGOisNz4rQLMoOBA+SPVvOAAVBT5gUPDI9xIwOAAKPnNzZsSDVhAIfHUoPjc3ABo4TOBlZXrbbpQUfCx4EBm0ADoAShFlt3gw3AI3AC44bGP8AG0AXTgAXjhroTg3xCmIQyhz+mHWVj4eiTDxYfDmADqSnwAAlgDBfuYsLMHAosOZ6HAyONXu8EJ9vr8wlAwIFgc0wZDoXCEQxWJkIOwmJjsbi3viUISGP9AeTQeCoYCaYjkaZkuiWTj3h9OdBful4aw+SQBdT4b83ABHLDANwKZlYqV4glyhjQWzqJUglVUoXqukMpmStkyr6mv68XnWymC2H2+hIlHijGGl0ct0-M0jIZWimqu20+j0hSMg2s6Xhrn0ApYWP821+xPJ1POjMmyP0c0x5U+tVFx1poT3ETiOAAYVscCYJDgrAAHjw+Eh4Mkgsw2NFKNBUZ64OZgJRKKxePh4MYYKx1NBgKxohAQqO3EEjhETgB+ETjoIAVXBy6gwDYl1P+EeiBdsorPKBRre+d9woMIGYpohiQhkEIV5wAASo+rDPk0TwIB+EZElgJJknAAA+UYWkq2EMDmVouv+da-MWTrgZBLBBAA8gAbvecEIQQb7IdKn6-N+mI4fQCobsCJE2gB-pajqerMlRlQQqwMgorkQT6FBYLAIMLjuHwTCoro+gnk0xivlYin4Fp+6orux4QGMwAFGONFuJeNEXI0rFPHAt7mExT4ua+OGwd5VwEQxXnwT5LYSAAMqgaDRFuEDmJM+AQKkfQwNEpRoIpoQ7pMqRBKktgjq4lDAFABxwJa8DaHoKJmaOcAPmwDRXG4myVDUuqfJ5cCpNAMV6PAUBgjAoCsJMVirNUNGEEgjXwOYEC7vgMjwEe-TqZSy4HAs2nwAABnpJwAGLQBgO57ZUnWDMoWn+aFVwyNESWpJs7adt2WCogQ9hmfoBVaXEUy1DG5lwHtup3Xt6l-FgfBQCG9WMDR9AXkIlBgsOqmvhDcFtId+DnCx+DbOc+PZDBzE+e+0q8DA6GvvQpEJpirFkwAZGzzUvpsTOFo8DxPEmDbCBBQj7IcPluCdUBnUETz461JXKBuUBtDjbC7K27wAHoXuLFKtE8KDoETxCkHjkvS7LmsSDrF5AA"&gt;Our answer&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;This challenge was first about understanding different read vs write properties available in both &lt;code&gt;classes&lt;/code&gt; and &lt;code&gt;interface&lt;/code&gt;/&lt;code&gt;typed&lt;/code&gt; objects. Personally, I've seen this with &lt;code&gt;document.location&lt;/code&gt; a lot where you always get a rich object when you read but can write to that property with a string. We wanted a similar concept, but using &lt;code&gt;punch&lt;/code&gt; which for me is generally a 'throw it all in and see what happens' style of drink.&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;PunchMixer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Punch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;flavour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]};&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Punch&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Punch&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Punch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ingredients&lt;/span&gt;&lt;span class="dl"&gt;'&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;punch&lt;/span&gt; &lt;span class="o"&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="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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;punch&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flavour&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;punch&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;punch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;punch&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;punch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;punch&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;This solution uses a mix of private class fields, indexed types and type narrowing to set up a local punch object which is always returned. &lt;/p&gt;

&lt;p&gt;The next step was to make this class generic in some form so that a type parameter passed in to the class would dictate what the return value of a &lt;code&gt;vend&lt;/code&gt; function was.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- class PunchMixer {
&lt;/span&gt;&lt;span class="gi"&gt;+ class PunchMixer&amp;lt;MixerType&amp;gt; {
+    mixer!: MixerType;
&lt;/span&gt;
  // ...
&lt;span class="gi"&gt;+   public vend(): MixerType {
+        return this.mixer;
+    }
&lt;/span&gt;  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We were not too worried about how you passed back the &lt;code&gt;MixerType&lt;/code&gt; - our first draft had &lt;code&gt;return {} as MixerType&lt;/code&gt; but a private field feels nicer. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEHUFMBsGMHsC2lQCMCGsDWoBmAnJUAT3gFd9RDV4AXAS1gGdQALTHWdRABwEJQATXIByAG4pUkSADtQ6JlkgATUPVwAoECXKgucskxSkKoGZADuoRfWjQWteKETol8qvBq1QF1o1Zs6DLK0JAsWmCI9AAe9DIA5qC0rCg8ZDKwAbjwlEGgZDwIUQmgPOj4tMQAdBoRoAAK6ZlqLHlxtJD4YQwlyvhxOFJchsa6+qVk3uh21jm0LPC4SX4JTHXtTvS0ADQkkN5bLfLQFujELLDQCkaqCqAARGkZrPc+KXImzq4o6HoFNRpKjwUI1nqAALygADeGlAcLwVzE5HwAC5rLR+glYfC4vEusp6LJ5miABRMDG40AAH2heHwZC2aPJmPiuxkZEQUlRZg5XNAAF8AJQAbQAuhp+bVtFBxCgXDxgapyN5fOgVbZoIEFbJ5N4TJQyhViLtxp8LP0Ou5Ltc6r5-D4clgWBYtgFpprkpIYPArAhlJAAPygWrWpgsUGZACyMU6AB5o9FOgAVYjAgB80OxcIAxE9MmiIwFIVDcIjkWiRCJdrj8YSZMTQGL+QBuLPOGP4PhohPJ1OQVtttKoaCMUDxfYTZ4kwUFpoBGHwxdUfYUOTJehMKq5uetxeSwdkYejozePOsEln2dgmmF4UiGsqOvzESi4XszmdUWCzNLnFLElApAiyTs04JgaAIjMriIjfguv5Luum7bs8VQPgSRKbmkTDnmegq7vB-KgDARhqP+IilugSIUCIahyLhP7wYuiFbmeEIgaw+G-oRxEoHBjFwsxyGZKhCS1hhVRYThc54W2e5tvui5DiOsCgBIwTTt2HYpsCDG-l0tCrssG5VFEib4JxAoSlKYAkuoOhkD4QTeI4ST4MQRnOq6yp6FcYZhLsnzjH08A8MsKDmFYUjQD62x1KgkygHQKT4C6Ri7DwoQKCgmUSB5ejwP6xzwOYgohsV5LtmZbERQ0c49vg07WaAADKSA-LADDlW89rsNqcjKBQlKeqU5SVLsLhxNA7kjKoLliNM9DKGqkB1PqPnXA6+BOvILCQNEwIdSoZUyBVRLJik9Sje5kIkjI3CQEyFIJN+4IZlCkoICd3h4ugqAAIIAOK+SwN13cgj0sulc5XpkL1vR95XOSFACqPCFmxt33RDuJQ88MOsHD0II198jKMoACSsAoDdl61c8hPvbUGi4E0nV0VdzW0KNTDTrppMU1TJKmZ0EnSW2bZnfgSYXVdJL3H99ylYuwv4KLYKQvcAMMuYYagAADFUev3LUi6S9LkCXUacsAEKK22Ktq6BtIEAytBovczLoBYXL9GE9xsrynRogAbJZEv1udFuy-cADCduLj9-1A9cNv+5VIu4W2jg8KjhZy3H40do7BPBvbRescWdKu+7P3AkwafvlyaIAEwAMyWcr5dzmx9z1HEkDoAqoSgAAUgyVPG222gkiFbPTNWSyfPSa5+BcBUoEw3AZZAuyIdYrDkNAqgyHQRH4IQ+BK3+oBC13KFoU+m6hAkySgHw4EACywbJ+UnfAoRVE6BfOWrVkDrhKPEU+wtVAFFomFdi8d4SSn3NoS23hm5HF+LgSwoARw6zQN6KwiENCGkqJzbmjUmox2Kj9eYu92AqkdCoRKCULAwE1CSNhbAQqQD4N+JgTgTAiFUCOJQdQXJMC4MPNaPD8BqnoMVJITh2DBGHi4GQ7kVYsDiPA0h1RgzaCTE4ZQThkhqnssI3B9A3AuRcDYlI61dbjnMP0KRU15DzVsL9UIdQgizWUZRH4eBWYKLkNkSgakCQlG8p6eglBQxGBYAAWjME4cwR1tAuQsDkNySinCIDIM0X6MSHH0F4KEZA9Z5GKP9FzWwLBkooAAFaGFoHUcczkHGAWdI6Skdw9oHQ6MoKopdAItX-vAGOsDK4IGitye4+JXiSjGcnXWlcmD0AAF4PQeEwFwdglm1BZhkNmI0KiEiYH9Wgf0NHNSkZAXmcFPoVRHGIXEAAleASB6rVRwYWeqsZWrRSmTwNMjU4TPO8FgLYmRZA-MhDVf5HZYyrKYGC0q2IzYyytvLRB0LaCwpkPVYuPdOZuWIFgY2ELEZjmBmxfFhLiWRPBaAbQ8IAB6AZsTxGBlUDZ2ymZwixVHHFtsr6vI+V8xAxKK4PHeawQ85RUCj3HpAKlv8KqwGmVYt5CRPnfKLsyq+bK4ScuxFqngVRZk5CskAA"&gt;Our Answer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-9"&gt;Figure out how to stop people giving you bad strings for your custom lengths.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-10"&gt;Stop losing your literals in Halloween posters&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Share Your Solution
&lt;/h2&gt;

&lt;p&gt;Once you feel you have completed the challenge, you will need to select the &lt;strong&gt;Share&lt;/strong&gt; button in the playground. This will automatically copy a playground URL to your clipboard.&lt;/p&gt;

&lt;p&gt;Then either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to Twitter, and create a tweet about the challenge, add the link to your code and mention the &lt;a href="https://twitter.com/typescript"&gt;@TypeScript&lt;/a&gt; Twitter account with the hashtag &lt;a href="https://twitter.com/search?q=%23TypeOrTreat"&gt;#TypeOrTreat&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave us a comment with your feedback on the &lt;a href="https://dev.to/typescript"&gt;dev.to&lt;/a&gt; post, or in this post.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Resources for Additional Help
&lt;/h3&gt;

&lt;p&gt;If you need additional help you can utilize the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/intro.html"&gt;The New TypeScript Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://discord.com/invite/typescript"&gt;TypeScript Community Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The comments on each &lt;a href="https://dev.to/typescript"&gt;Dev.to&lt;/a&gt; post!&lt;/li&gt;
&lt;li&gt;Our previous &lt;a href="https://www.typescriptlang.org/play/#gist/303ebff59a6fc37f88c86e86dbdeb0e8-0"&gt;&lt;code&gt;Type | Treat&lt;/code&gt; 2020 challenges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Typing :)&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Type | Treat 2021 - Day 2</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Tue, 26 Oct 2021 19:35:06 +0000</pubDate>
      <link>https://dev.to/typescript/type-treat-2021-day-2-1ojn</link>
      <guid>https://dev.to/typescript/type-treat-2021-day-2-1ojn</guid>
      <description>&lt;h2&gt;
  
  
  Type | Treat Challenge 2
&lt;/h2&gt;

&lt;p&gt;Welcome to the second &lt;code&gt;Type | Treat&lt;/code&gt; challenge! These challenges are a series of blog posts which have 2 code challenges in, one for beginners and one for intermediate TypeScript programmers. We're on day two, which means going over the answers from yesterday and 2 new challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yesterday's Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;The first part of the solution for this challenge used &lt;code&gt;as const&lt;/code&gt; to trigger "Literal Inference" - basically telling TypeScript "Don't convert the array to &lt;code&gt;string[]&lt;/code&gt; but consider it a constant set of string literals. This meant that &lt;code&gt;playlist[0]&lt;/code&gt; stopped returning &lt;code&gt;string&lt;/code&gt; and started returning &lt;code&gt;"The Legend of Sleepy Hollow by The Monotones.mp3"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;  const playlist = [
      "The Legend of Sleepy Hollow by The Monotones.mp3",
      ...
&lt;span class="gd"&gt;- ]
&lt;/span&gt;&lt;span class="gi"&gt;+ ] as const
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second part of the challenge used &lt;a href="https://www.typescriptlang.org/docs/handbook/2/typeof-types.html"&gt;&lt;code&gt;typeof&lt;/code&gt; types&lt;/a&gt; to extract the type from the &lt;code&gt;playlist&lt;/code&gt; array. Without the first change, this would be &lt;code&gt;string&lt;/code&gt; but after the change this meant the full array of different types. You then needed to use the &lt;a href="https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html"&gt;type index syntax&lt;/a&gt; &lt;code&gt;[number]&lt;/code&gt; to declare that you want any potential string from that array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- function playSong(song: string) {
&lt;/span&gt;&lt;span class="gi"&gt;+ function playSong(song: typeof playlist[number]) {
&lt;/span&gt;      api.play(song)
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Successfully completing this challenge would raise an error in the final code samples due to a subtle typo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEEkDtQBwJwKbwIYBcCWB7aAzTdQALZAGxMwHcEFIAaUAT0wFcByANwVACMEBjTAFsuqQlwDOxRABNQAEQBSoPHABQIUKRKMWBHHHQ1p4gHSgAmiw4SEqUMxihREhuNQJBTzKGno3B7mZ3JzFQQWZxdD51MAj0SABzEK5CdEdIBAonBhgEdBwGUABBAAVwMFBVVXRBGHw7AG9UHLyC0vAAX2U4IVAAImbcgFp8IdREND6qgUg3WBJkBhI-OwBeUABtVVAd-oAVUIAZBASjUEwcUABlEmoYQoAJTDJKHkKDrgBZbExUbARTLUAMx9WjbXZ9AAU4FQrHEmgAlKBvrN3HA4aAnstpIs3qAAELMPgAa1AAHkqLMTMDQeCdn18d5PtRUPDnMjsG4EARuIVGfJ0NJpLcGNSYCCwbt+iVmHAYLdQCUEJh5VwAKJobnIlls0IAdXQqD4hHkmD4fx571C+PQSUZMFycDFErp-SufAmgniBK0oEhaHkcGQfGYC0xWiRvNAH3kzBK2FZztpUoZaEEyDooD1zxw6czADEg5BiTQufF6PhA8HQ8g8TG5OhkIJsMYk5KIYWMyXUXloHsKCs66EAMJwVyoUiA8XJiGsA4GMjc1h4z5RYgIbQKYPE8TYJOqAC6mnhMzcVXli2WZ40AD0APwxaMtd0GGB2UTxHchPygH+1q92BcoD+PECTiPQFCpMav5snAzBcEMPBBKAfAZjozCVBo6Ylk+uQvmk74TO+oQXksg7IHAQaFM2iD9MgJ6chOkCsn0D6qKedjIDA6CgOsgytAw7SQn0ggMAA+lx6BiSWDB9AiqiSSYMwZOakLyaoODMJA5pYNApFXNgCSQruiQAFzZLkQGkQBGyQMwgi8HAB5Ig0rqKaRxmGfJHTngsDAGYkwkynKCpKiqCoami2q2LqXAGkaJpyGaFpDlwNp2iqjpJupGgHD+FD4F+CREQAhASyGGihLAkLIvCaKAyyoKgCo0VwiCRFyzFeBZmDgShaFMMwj4fsW5yXLWFC4n8KHEIkIihAABvphkLaAC0mQkq0wBRTa2FqiARPNXADC0Fx9MkmFgNZKz0LuIQBnsz4egRoBBn4AKaNA3I9AQ+TJIgGK1oMmBsctgVQjCgNIiiXLovCWKCriUaEiS5KUlOILyWDRl9DGxynJAshATcdyPM85BZFGMYor8-wY3JqjY8J+Jphm9DZiQuZs6AnbFqW7jlucBByBRIZhlToQNk2Lb0wiQA"&gt;Our answer&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;This pattern is quite common in code we write in TypeScript codebases, you create one function which takes the result of another and keeps passing objects between functions in a pipeline. One of the best techniques for simplifying this design pattern is to use &lt;a href="https://www.typescriptlang.org/docs/handbook/utility-types.html#returntypetype"&gt;&lt;code&gt;ReturnType&lt;/code&gt;&lt;/a&gt; with &lt;a href="https://www.typescriptlang.org/docs/handbook/2/typeof-types.html"&gt;&lt;code&gt;typeof myFunc&lt;/code&gt;&lt;/a&gt; to map the return type of one function to the paramter of another. This removes the need for intermediary types which need to be updated when the functions change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;  const findOldCostume = () =&amp;gt; {
      // ...
      return { jumpSuit, estimate }
  }

- const createNewMask = (costume: any) =&amp;gt; {
&lt;span class="gi"&gt;+ const createNewMask = (costume: ReturnType&amp;lt;typeof findOldCostume&amp;gt;) =&amp;gt; {
&lt;/span&gt;      // ...
      return { ...costume, mask }
  }

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

&lt;/div&gt;



&lt;p&gt;The little extra step at the end was a small reminder that you can use this technique to provide a type which can be re-used everywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Costume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;assembleCostume&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/PTAEGEHsGcBcFcC2BTUAHATstpYEsUAaUAT0nlADM8BzeLUAIgHcALE0AO0llABMs0aKHg4ANngDWyAFAhcrVAENOsJTUic8cYXk4LUAZQCO8PH1ABxJSgD8jYnl7RkyRMMzJYsDsiXQSOTAAI39kC01ScgxQSDELcH8lflQABSU0ZDFY+FhqWAA6UCDQAApQVm80aAAuED54AGNJBuaNAsbIRGBbYwBeRqSAaj5kIbQMrIAyPCUADz6CdWRoGaVFxGXoAEoZEoBNclAXXn9zVHwUXEgqWnpUcl42JV4yeAByBg09GmuuVwssBuJU6nAAbsgMLxYIpQKC4EhlJwLNBpLBGqwctDYWgeMhVLNssxIBhJNcSjQ8BCovQXGJKKAVKBzslIAzLitBmJkDU9gRcVDQABvFxKDAY4iYPSwSEAXyoGC6TB8mQAtCTVbAsC9GHt4bxqMiAPLxKAIq59MrbUB9AB8wpkoCdcM0cFAACskGhDGZeJbReLWAUXvhGqVrQAfCPHPyBjpiGBecOgKMxsUYgo0MXLcOO5360ArS4vVCWgDMAAY806sAgMPohR6vT6nMQi0sZaBZTJuzIC41tTKAHLIZgAWX8ZMtpU65p5oAASl56JwACokTIAHhVyDZt2NppgCBQtutdodzpdnDdm1RNvQGGlkIKUtUE9Rucvt8kBWgrEm96MI0eDityuqXrOx7IAU7abJ2QyWgAbFWl61iuwqgAUWGQYixDfl2PZ6q6vADn4MoAEKQHwJCJCgGDJNOOEoDUTpLnWa4bsg26cXupEliO46TqeNr2kK1ZXm6gx0QxD5PhgL6PqotGQkon7OvIACSTx4GI2ScAC6BKNKPzXJA4lMdBsElqACGgAALAArOJaH1hhWEdEeuFwjYKkEb2Bb+C4iDBNyZpQfeybnmJqHLq5fEUVRNE+fRM6DsgAnvpIpSGnwJp8GFiLhtsuy9vIliDsQMLaHCaXCEygVuCFHASPpsQMkoukGIZUJ1ciJQwqgxKkjS-zhH8fCQEUAASkDMMgEIYI4vBYBIKyxPoAAGKgkBtwhsHgGLFPImzSHtJKSCZzBOJiA2Mo0CAdS6c6MqAwROIywV3OQtREdeJGeRajJCI1oUA8gubyM6AB6th7PIiT6G8Ch6GSe7JMwSgcECtxzF1eiUJC+KNIN12PDVZE-CU+nMKAG07rtsQxBtcmUEoxO7cQJKgFgaBiGzJm3dte3XbTjbuV2G2wyUGmjB1YhY6w1U7numCQCFbjefowSoNAcQQiiNwwi8I2DJwJQncocL-pwNCoHo60POysKUPAnD3XgrqMsiXA8KNgI3KIfDWbdO7QAUcNgIcHydZI3A0+9Q3SBYbD4sjwgtag9HaGtTKQoqGB9q6cTQQmNClBtWnHKw5DxLgSjSIywRkwAJEKFkFBy8qIHouQrBtuwlEOs0KMbc3vNSGinKAicmWgeCZBnxCmyNtv6fRnbJDuJT7YdPOCPisDCLd+J8KqcDWWjwPBaDz26yPvA8IoGDQCCTJYKq8AuMyvB8zKGBSzuCAYN7xsRXOuLcyt2pX3VgVE8QA"&gt;Our Answer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beginner/Learner Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-5"&gt;Help sort out a large array of pumpkins, and then get cooking soup.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-6"&gt;Fresh back from robotics camp, can you make the perfect punch mixer bot?&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Share Your Solution
&lt;/h2&gt;

&lt;p&gt;Once you feel you have completed the challenge, you will need to select the &lt;strong&gt;Share&lt;/strong&gt; button in the playground. This will automatically copy a playground URL to your clipboard.&lt;/p&gt;

&lt;p&gt;Then either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to Twitter, and create a tweet about the challenge, add the link to your code and mention the &lt;a href="https://twitter.com/typescript"&gt;@TypeScript&lt;/a&gt; Twitter account with the hashtag &lt;a href="https://twitter.com/search?q=%23TypeOrTreat"&gt;#TypeOrTreat&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave us a comment with your feedback on the &lt;a href="https://dev.to/typescript"&gt;dev.to&lt;/a&gt; post, or in this post.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Resources for Additional Help
&lt;/h3&gt;

&lt;p&gt;If you need additional help you can utilize the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/intro.html"&gt;The New TypeScript Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://discord.com/invite/typescript"&gt;TypeScript Community Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The comments on each &lt;a href="https://dev.to/typescript"&gt;Dev.to&lt;/a&gt; post!&lt;/li&gt;
&lt;li&gt;Our previous &lt;a href="https://www.typescriptlang.org/play/#gist/303ebff59a6fc37f88c86e86dbdeb0e8-0"&gt;&lt;code&gt;Type | Treat&lt;/code&gt; 2020 challenges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Typing :)&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Type | Treat 2021 - Day 1</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Tue, 26 Oct 2021 07:09:21 +0000</pubDate>
      <link>https://dev.to/typescript/type-treat-2021-day-1-6an</link>
      <guid>https://dev.to/typescript/type-treat-2021-day-1-6an</guid>
      <description>&lt;h2&gt;
  
  
  Type or Treat Challenges
&lt;/h2&gt;

&lt;p&gt;Today we're starting up our second year of &lt;code&gt;Type | Treat&lt;/code&gt; (or "Type or Treat".) We will be presenting some "spooky" code challenges that will allow you to dig deeper into the TypeScript language in a fun way.&lt;/p&gt;

&lt;p&gt;Starting right now, a new code challenge will be posted every weekday, along with its solution the day after. The last solution will be posted on the weekend.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Participate
&lt;/h2&gt;

&lt;p&gt;In order to participate you only need to be able to access the &lt;a href="https://www.typescriptlang.org/"&gt;TypeScript website&lt;/a&gt;. Though ideally, you share with us your answers via our &lt;a href="https://dev.to/typescript"&gt;dev.to blog post mirrors&lt;/a&gt;, here, or via Twitter to &lt;a href="https://twitter.com/typescript"&gt;@TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You will want to start here on the blog to find the details on the code challenges for the day. Each post contains 2 links to different challenges which run in the TypeScript playground. Via the playground, you can work on the challenge in your browser and you will be able to test your code live to see if it properly passes the challenge.&lt;/p&gt;

&lt;h3&gt;
  
  
  How To Share Your Solution
&lt;/h3&gt;

&lt;p&gt;Once you feel you have completed the challenge, you will need to select the &lt;strong&gt;Share&lt;/strong&gt; button in the playground. This will automatically copy a playground URL to your clipboard.&lt;/p&gt;

&lt;p&gt;Then either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to Twitter, and create a tweet about the challenge, add the link to your code and mention the &lt;a href="//twitter.com/typescript"&gt;@TypeScript&lt;/a&gt; Twitter account with the hashtag &lt;a href="https://twitter.com/search?q=%23TypeOrTreat"&gt;#TypeOrTreat&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave us a comment with your feedback on the &lt;a href="https://dev.to/typescript"&gt;dev.to&lt;/a&gt; post, or in this post.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Resources for Additional Help
&lt;/h3&gt;

&lt;p&gt;If you need additional help you can utilize the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/intro.html"&gt;The New TypeScript Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://discord.com/invite/typescript"&gt;TypeScript Community Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The comments on each &lt;a href="https://dev.to/typescript"&gt;Dev.to&lt;/a&gt; post!&lt;/li&gt;
&lt;li&gt;Our previous &lt;a href="https://www.typescriptlang.org/play/#gist/303ebff59a6fc37f88c86e86dbdeb0e8-0"&gt;&lt;code&gt;Type | Treat&lt;/code&gt; 2020 challenges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Day 1 Challenges
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Beginner/Learner Challenge
&lt;/h4&gt;

&lt;p&gt;Using the new music streaming service from the TypeScript team, Typify, set up and share your halloween playlist with your friends.&lt;/p&gt;

&lt;p&gt;Head to &lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-1"&gt;this link&lt;/a&gt; and help us figure out the best type to use in one of our function parameters!&lt;/p&gt;

&lt;h4&gt;
  
  
  Intermediate/Advanced Challenge
&lt;/h4&gt;

&lt;p&gt;You've figured out your costume, but making it is a bit of a process. Can you figure out how to make all of the parts come together in a type-safe way?&lt;/p&gt;

&lt;p&gt;Head over &lt;a href="https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-2"&gt;to start sorting&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Announcing the new TypeScript Website</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Tue, 15 Sep 2020 19:23:02 +0000</pubDate>
      <link>https://dev.to/typescript/announcing-the-new-typescript-website-ef6</link>
      <guid>https://dev.to/typescript/announcing-the-new-typescript-website-ef6</guid>
      <description>&lt;p&gt;Hey folks, I'm happy to announce that the next iteration version of the TypeScript Website has launched on &lt;a href="https://www.typescriptlang.org"&gt;typescriptlang.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new of the website was built out of a desire to make the documentation for TypeScript feel as expansive as its type&lt;br&gt;
system, with a design that fits &lt;a href="https://www.microsoft.com/design/fluent/"&gt;modern&lt;/a&gt; Microsoft styles.&lt;/p&gt;

&lt;p&gt;To get a sense of what people wanted, &lt;a href="https://github.com/microsoft/TypeScript/issues/31983"&gt;we reached out to the community&lt;/a&gt; about where they would like to see improvements and road-mapped based on that feedback.&lt;/p&gt;

&lt;p&gt;Community requests generally coalesced into a few major areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigation can be difficult&lt;/li&gt;
&lt;li&gt;The playground feels limited&lt;/li&gt;
&lt;li&gt;Missing or not up-to-date docs&lt;/li&gt;
&lt;li&gt;It's hard to read up about &lt;code&gt;tsconfig.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of that we wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A revised intro to TypeScript on the homepage&lt;/li&gt;
&lt;li&gt;Compiler-backed code samples&lt;/li&gt;
&lt;li&gt;Improved accessibility&lt;/li&gt;
&lt;li&gt;To support learning TypeScript in your own (human) language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's go through these points and learn about how the new TypeScript website addresses them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Welcome to the new TypeScript Website
&lt;/h2&gt;

&lt;p&gt;We decided on the design and copy for the homepage for TypeScript 6 years ago, but things have changed quite a lot since then. TypeScript has grown up and understands what it wants to be: a type layer above JavaScript that provides great tooling support.&lt;/p&gt;

&lt;p&gt;This focus means explaining how the team works with JavaScript standard bodies, describing how DefinitelyTyped allows TypeScript to provide types to un-typed libraries, and teaching how adoption of TypeScript doesn't have to be an all or nothing choice.&lt;/p&gt;

&lt;p&gt;Hopefully, the new homepage makes it easier to understand TypeScript's place in the JavaScript ecosystem.&lt;/p&gt;

&lt;p&gt;Also, a personal highlight from the re-design, the new TypeScript logo which more closely reflects what people use in the wild:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v868h7Pk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ydegl03ghol1vyan5agc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v868h7Pk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ydegl03ghol1vyan5agc.png" alt="TypeScript logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  New Navigation
&lt;/h2&gt;

&lt;p&gt;We addressed a lot of site navigation issues by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely &lt;a href="https://github.com/microsoft/TypeScript-Website/issues/130#issuecomment-560546774"&gt;splitting mobile vs desktop&lt;/a&gt; site navigation so they are more focused on their domains&lt;/li&gt;
&lt;li&gt;Adding search for our documentation&lt;/li&gt;
&lt;li&gt;Interweaving code samples for the playground with existing documentation, making it easy to interact with ideas instead of just passively reading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sitemap has been revised (without breaking any links) to allow for more sections of documentation, the new sitemap provides a more hierarchical approach to the documentation which should make it easier to find what you're looking for quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playground v3
&lt;/h2&gt;

&lt;p&gt;Over the past year, the playground has jumped in leaps and bounds - you can find out all of the features and changes to&lt;br&gt;
TypeScript's interactive code explorer in it's own post coming soon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bEpHCzb2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qm41dllixyv155y1okxm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bEpHCzb2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qm41dllixyv155y1okxm.jpg" alt="Screenshot of TypeScript Playground"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, the summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sharable URLs are compressed to make sure they're not too long&lt;/li&gt;
&lt;li&gt;There is a comprehensive set of examples teaching TypeScript in the Playground&lt;/li&gt;
&lt;li&gt;Options from the &lt;code&gt;tsconfig.json&lt;/code&gt; have explanations&lt;/li&gt;
&lt;li&gt;The you can resize the sidebar&lt;/li&gt;
&lt;li&gt;You can write in JS or TS, and see the .js or .d.ts outputs&lt;/li&gt;
&lt;li&gt;Errors show in the sidebar&lt;/li&gt;
&lt;li&gt;Types get downloaded from npm&lt;/li&gt;
&lt;li&gt;The Playground can be extended by &lt;a href="https://www.typescriptlang.org/dev/playground-plugins/"&gt;user plugins&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's &lt;a href="https://www.typescriptlang.org/play?install-plugin=playground-clippy"&gt;an example plugin&lt;/a&gt; which adds Clippy to the Playground:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x23XRXOI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hwb3rfb4zd9aw0lv8z2o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x23XRXOI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hwb3rfb4zd9aw0lv8z2o.jpg" alt="clippy2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Handbook v1.5
&lt;/h4&gt;

&lt;p&gt;The new handbook has a different structure. The previous handbook was a single section of the website, the new site features a lot more documentation pages and splits the handbook into three main sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intros to TypeScript&lt;/strong&gt; - which help you get an understanding of the language based on different backgrounds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handbook&lt;/strong&gt; - the 'read from a-z' of TypeScript to get a better understanding of the language primitives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handbook Reference&lt;/strong&gt; - singular deep dives into a particular topic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This split is especially helpful when starting to learn TypeScript, as it provides a focused track to learn. Then later, as you need particular techniques, there are reference docs which explore a topic in more depth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kQPEnSCR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lnvsy2pwrpz9givxp7mg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kQPEnSCR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lnvsy2pwrpz9givxp7mg.jpg" alt="Handbook screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Compiler-Checked Samples
&lt;/h4&gt;

&lt;p&gt;We're moving more and more of our code samples to use a new &lt;a href="https://github.com/microsoft/TypeScript-Website/tree/v2/packages/ts-twoslasher#typescript-twoslasher"&gt;TypeScript markup format called twoslash&lt;/a&gt;. Twoslash code samples use the TypeScript compiler to generate accurate error messages, get compiler outputs, and query hover tooltips for quick-info. This information can then be rendered in a a static page for code samples.&lt;/p&gt;

&lt;p&gt;With this technique we can be certain that our code samples stay accurate and up-to-date as we work on the TypeScript compiler.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U30bdgzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lkyoc3y10jgxhlosuwsm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U30bdgzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lkyoc3y10jgxhlosuwsm.gif" alt="Interactive code sample screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TSConfig Updates
&lt;/h2&gt;

&lt;p&gt;One of the biggest areas for improvement was our documentation for the collection of over 100 compiler flags. The new TypeScript website includes a long-form description for every flag and examples are compiler-backed. This means we can be sure that the examples show exactly what happens when a particular config is changed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xJzuWpTV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ylduhh9iiguef2ji4klx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xJzuWpTV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ylduhh9iiguef2ji4klx.jpg" alt="TSConfig Reference Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;The new website has been built with accessibility auditing happening on CI from day one.&lt;/p&gt;

&lt;p&gt;To give a sense of the support matrix, here's what we account for with each page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript being disabled&lt;/li&gt;
&lt;li&gt;Keyboard-only navigation&lt;/li&gt;
&lt;li&gt;Text-to-Speech users&lt;/li&gt;
&lt;li&gt;Cookies/Local Storage being denied&lt;/li&gt;
&lt;li&gt;A focused mobile navigation design&lt;/li&gt;
&lt;li&gt;Light and Dark OS mode support, with a user-preference switcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Localization
&lt;/h2&gt;

&lt;p&gt;Anyone can learn to code, but adding the extra barrier of being proficient in English to master a programming language is a worry. We're a small compiler team, and wanted to provide the infrastructure to enable others to localize our site. Every section of the new site is built with multi-language support in mind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s1IXEyBN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lw3bdmgphqp0s7ewy53v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s1IXEyBN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lw3bdmgphqp0s7ewy53v.png" alt="Screenshot of the website in Chinese"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've gotten far on the translations for Chinese, Japanese, Portuguese and Spanish - you can see how far along they are via &lt;a href="https://github.com/microsoft/TypeScript-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22Localization+Summary%22"&gt;these GitHub issues&lt;/a&gt;. If you're interested in helping out, come and say hi in the &lt;a href="https://discord.gg/typescript"&gt;TypeScript Community Discord&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it today
&lt;/h2&gt;

&lt;p&gt;The new site was started exactly &lt;a href="https://github.com/microsoft/TypeScript-Website/commit/7d8d0bd6c3771f7a3f9f5951731b9b5f5d745db4"&gt;a year ago&lt;/a&gt;, getting here took over 1600 commits and received contributions from over &lt;a href="https://github.com/microsoft/TypeScript-Website/graphs/contributors"&gt;100 people&lt;/a&gt;. You can read more about the motivations for how the site was designed and architected in the &lt;a href="https://github.com/microsoft/TypeScript-Website/issues/130"&gt;"Web Infra Updates"&lt;/a&gt; GitHub issue.&lt;/p&gt;

&lt;p&gt;With that said, we're always &lt;a href="https://github.com/microsoft/TypeScript-Website/issues/new/choose"&gt;open to feedback&lt;/a&gt; and there's a lot of space for improvement now that everyone can provide some fresh perspective.&lt;/p&gt;

&lt;p&gt;Give the new site a shot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/tsconfig"&gt;TSConfig Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/play"&gt;Playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs"&gt;Docs Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested in seeing the great localization work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/zh"&gt;Chinese Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/ja/tsconfig"&gt;Japanese TSConfig Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/es/play"&gt;Spanish Playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/pt/play"&gt;Portuguese TSConfig Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>design</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Let people own a subset of your repo</title>
      <dc:creator>Orta</dc:creator>
      <pubDate>Thu, 13 Aug 2020 17:59:11 +0000</pubDate>
      <link>https://dev.to/orta/let-people-own-a-subset-of-your-repo-50ob</link>
      <guid>https://dev.to/orta/let-people-own-a-subset-of-your-repo-50ob</guid>
      <description>&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;The Action: &lt;a href="https://github.com/marketplace/actions/code-owner-self-merge"&gt;code-owner-self-merge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the &lt;a href="https://github.blog/2017-07-06-introducing-code-owners/"&gt;CODEOWNERS&lt;/a&gt; format (a set of globs, then a set of GitHub usernames) you can define areas in a codebase which gives people the right to merge PRs which just affect their spaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Maintainer Must-Haves&lt;/p&gt;

&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/orta"&gt;
        orta
      &lt;/a&gt; / &lt;a href="https://github.com/orta/code-owner-self-merge"&gt;
        code-owner-self-merge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A GitHub Action for letting CODEOWNERS merge PRs via green PR reviews
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;A GitHub action that lets code-owners merge PRs via a comment.&lt;/p&gt;
&lt;p&gt;This action uses the standardized structure of &lt;a href="https://github.blog/2017-07-06-introducing-code-owners/" rel="nofollow"&gt;a CODEOWNERS file&lt;/a&gt; to handle the access controls.&lt;/p&gt;
&lt;h2&gt;
A simple example&lt;/h2&gt;
&lt;p&gt;So, with this file at: &lt;code&gt;.github/CODEOWNERS&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;README.md &lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If a PR contained &lt;em&gt;only&lt;/em&gt; a change to the &lt;code&gt;README.md&lt;/code&gt; - this action would say that "&lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;
 has the ability to merge by commenting 'LGTM'".&lt;/p&gt;
&lt;p&gt;Then, when/if this happens the GitHub Action will merge for you.&lt;/p&gt;
&lt;h2&gt;
A real-world example&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.github/CODEOWNERS&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Collaborators for Japanese Translation of the Website&lt;/span&gt;
packages/playground-examples/copy/ja/&lt;span class="pl-k"&gt;**&lt;/span&gt; &lt;a class="comment-mentioned-user" href="https://dev.to/sasurau4"&gt;@sasurau4&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/quramy"&gt;@quramy&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/naturalclar"&gt;@naturalclar&lt;/a&gt;
 @Takepepe &lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;

packages/tsconfig-reference/copy/ja/&lt;span class="pl-k"&gt;**&lt;/span&gt; &lt;a class="comment-mentioned-user" href="https://dev.to/sasurau4"&gt;@sasurau4&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/quramy"&gt;@quramy&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/naturalclar"&gt;@naturalclar&lt;/a&gt;
 @Takepepe &lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;

packages/typescriptlang-org/src/copy/ja/&lt;span class="pl-k"&gt;**&lt;/span&gt; &lt;a class="comment-mentioned-user" href="https://dev.to/sasurau4"&gt;@sasurau4&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/quramy"&gt;@quramy&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/naturalclar"&gt;@naturalclar&lt;/a&gt;
 @Takepepe &lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;

packages/documentation/copy/ja/&lt;span class="pl-k"&gt;**&lt;/span&gt; &lt;a class="comment-mentioned-user" href="https://dev.to/sasurau4"&gt;@sasurau4&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/quramy"&gt;@quramy&lt;/a&gt;
 &lt;a class="comment-mentioned-user" href="https://dev.to/naturalclar"&gt;@naturalclar&lt;/a&gt;
 @Takepepe &lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This allows any of &lt;code&gt;@sasurau4&lt;/code&gt;, &lt;code&gt;@Quramy&lt;/code&gt;,  &lt;code&gt;@Naturalclar&lt;/code&gt;, &lt;code&gt;@Takepepe&lt;/code&gt; or &lt;code&gt;@orta&lt;/code&gt; to merge PRs which affect their areas of the translation process in the TypeScript Website repo.&lt;/p&gt;
&lt;h2&gt;
Setting It Up&lt;/h2&gt;
&lt;p&gt;You want a…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/orta/code-owner-self-merge"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Codeowners merging&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request_target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;issue_comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;created&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Codeowners merge check&lt;/span&gt;
      &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;orta/code-owner-self-merge@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;This is being used in the new TypeScript Website, to give translators access to merge PRs to their language: &lt;a href="https://github.com/microsoft/TypeScript-Website/pull/899"&gt;https://github.com/microsoft/TypeScript-Website/pull/899&lt;/a&gt;&lt;/p&gt;

</description>
      <category>actionshackathon</category>
      <category>github</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
