{"id":3168,"date":"2021-10-28T11:22:01","date_gmt":"2021-10-28T19:22:01","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/typescript\/?p=3168"},"modified":"2023-04-27T13:18:08","modified_gmt":"2023-04-27T21:18:08","slug":"type-treat-2021-day-4","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/typescript\/type-treat-2021-day-4\/","title":{"rendered":"Type | Treat 2021 \u2013 Day 4"},"content":{"rendered":"<h2>Type | Treat Challenge 4<\/h2>\n<p>Welcome to the fourth <code>Type | Treat<\/code> 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&#8217;re on day four, which means going over the answers from <a href=\"https:\/\/devblogs.microsoft.com\/typescript\/type-treat-2021-day-3\/\" rel=\"nofollow\">yesterday<\/a> and have 2 new challenges.<\/p>\n<h2>Yesterday&#8217;s Solution<\/h2>\n<h3>Beginner\/Learner Challenge<\/h3>\n<p>I wonder if we over-indexed on the difficulty here, and we&#8217;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 <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/2\/template-literal-types.html\" rel=\"nofollow\">template string literal<\/a> type which accounted for string input which <em>roughly<\/em> matched how CSS&#8217;s stringy variables worked.<\/p>\n<p>You started with:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">string<\/span><\/pre>\n<\/div>\n<p>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: <code>\"\"<\/code>. Next we provided some valid input for you to work with:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-en\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">number<\/span><span class=\"pl-kos\">}<\/span><\/span>in`<\/span>\r\n\r\n<span class=\"pl-c\">\/\/ Works with:<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"0in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"12in\"<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p>Giving you a sense that a number can be used in the template slot &#8211; which allows for all sorts of possibilities.<\/p>\n<p>Next we gave samples with different prefixes, so <code>\"in\"<\/code> and <code>\"cm\"<\/code> would need to be handled. To get that right, you would need to use a union:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Unit<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"cm\"<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">\"in\"<\/span>\r\n<span class=\"pl-en\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">number<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Unit<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span>\r\n\r\n<span class=\"pl-c\">\/\/ Works with:<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"0in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"12in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"1.5cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"20cm\"<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p>Next we threw a curve ball &#8211; <code>\"0\"<\/code> should also be acceptable, this is a bit of a curve ball, but also it&#8217;s a bit of a trick:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Unit<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"cm\"<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">\"in\"<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">\"\"<\/span>\r\n<span class=\"pl-en\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">number<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Unit<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span>\r\n\r\n<span class=\"pl-c\">\/\/ Works with:<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"0in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"12in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"1.5cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"20cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"0\"<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p>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:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Unit<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"cm\"<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">\"in\"<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">\"\"<\/span>\r\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Space<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\" \"<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">\"\"<\/span>\r\n<span class=\"pl-en\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">number<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Space<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Unit<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span>\r\n\r\n<span class=\"pl-c\">\/\/ Works with:<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"0in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"12in\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"1.5cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"20cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"0\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"12 cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"14 in\"<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p>That was is for the easy parts of the challenge. It&#8217;s pretty tricky, because it requires that you understand that <code>number<\/code> can be anything in the template string and to understand how a union can allow for different types of strings inside the type. That&#8217;s all in the main docs, but it could be a lot of ideas to learn at once.<\/p>\n<p>This challenge also had a set of complications, cases where the version of the the <code>Length<\/code> type we expected people to build would provide interesting edge cases:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-c1\">0.3e21<\/span><span class=\"pl-kos\">}<\/span><\/span>cm`<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"-12 cm\"<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Infinity<\/span><span class=\"pl-kos\">}<\/span><\/span>cm`<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">NaN<\/span><span class=\"pl-kos\">}<\/span><\/span>cm`<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<details>\n<summary><b>Click to learn about these cases<\/b><\/summary>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-c1\">0.3e21<\/span><span class=\"pl-kos\">}<\/span><\/span>cm`<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p>Acted as a potential clue to an alternative answer for these failing cases:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Infinity<\/span><span class=\"pl-kos\">}<\/span><\/span>cm`<\/span><span class=\"pl-kos\">)<\/span>\r\n<span class=\"pl-en\">req<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">NaN<\/span><span class=\"pl-kos\">}<\/span><\/span>cm`<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p>Because <code>number<\/code> can be switched out with <code>bigint<\/code> in the type of <code>Length<\/code>:<\/p>\n<div class=\"highlight highlight-source-diff\">\n<pre><span class=\"pl-md\"><span class=\"pl-md\">-<\/span> type Length = `${number}${Space}${Unit}`<\/span>\r\n<span class=\"pl-mi1\"><span class=\"pl-mi1\">+<\/span> type Length = `${bigint}${Space}${Unit}`<\/span><\/pre>\n<\/div>\n<p>This meant you couldn&#8217;t pass in <code>Infinity<\/code> or <code>NaN<\/code> but also broke <code>req(\"1.5cm\")<\/code> because you can&#8217;t have point values. This could be fixed via:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-en\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">bigint<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Space<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Unit<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">bigint<\/span><span class=\"pl-kos\">}<\/span><\/span>.<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">bigint<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Space<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Unit<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span><\/pre>\n<\/div>\n<p>Which describes both possible cases with a &#8220;.&#8221; and without. This technique still doesn&#8217;t handle the <code>req(\"-12 cm\")<\/code>, and actually, it introduces a whole new problem: <code>req(\"-12.-12cm\")<\/code> is allowed!<\/p>\n<p>We spotted a good answer from <a href=\"https:\/\/twitter.com\/danvdk\/status\/1453503071087169536\" rel=\"nofollow\">@danvdk<\/a> which revolved around using string manipulation instead, by introducing a <code>Digit<\/code> type:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Whitespace<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">''<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">' '<\/span><span class=\"pl-kos\">;<\/span>\r\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Unit<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'in'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'cm'<\/span><span class=\"pl-kos\">;<\/span>\r\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Digit<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'0'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'1'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'2'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'3'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'4'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'5'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'6'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'7'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'8'<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'9'<\/span><span class=\"pl-kos\">;<\/span>\r\n<span class=\"pl-en\">type<\/span> <span class=\"pl-smi\">Length<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">`<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Digit<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">number<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">''<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Whitespace<\/span><span class=\"pl-kos\">}<\/span><\/span><span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-smi\">Unit<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s\">'0'<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p>This solution correctly handles the case of <code>req(\"-12 cm\")<\/code> but via that <code>number<\/code> would allow something like <code>req(\"1-22 cm\")<\/code> &#8211; which you can pretend is to handle an input range. It wouldn&#8217;t be hard to take this solution and reasonably cover additional edge cases. Very cool solution.<\/p>\n<\/details>\n<p><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\" rel=\"nofollow\">Our answer<\/a><\/p>\n<h3>Intermediate\/Advanced Challenge<\/h3>\n<p>The intermediate challenge was on type literals mixed with generics functions. The challenge started with this function:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">makeTitle<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\r\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"&lt;spooky&gt;\"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toUpperCase<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s\">\"&lt;\/spooky&gt;\"<\/span>\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p>The goal was to keep track of string literals through this function. To do this, you need to switch the <code>str: string<\/code> to be a type argument:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">makeTitle<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Str<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: <span class=\"pl-smi\">Str<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\r\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"&lt;spooky&gt;\"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toUpperCase<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s\">\"&lt;\/spooky&gt;\"<\/span>\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p>You know that the type argument has to be a string, which you can tell TypeScript via <code>&lt;Str extends string&gt;<\/code>, then you can re-use the <code>Str<\/code> in the return position:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">makeTitle<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Str<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: <span class=\"pl-smi\">Str<\/span><span class=\"pl-kos\">)<\/span>: `<span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">spooky<\/span><span class=\"pl-c1\">&gt;<\/span>${<span class=\"pl-smi\">Uppercase<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">Str<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-smi\">spooky<\/span><span class=\"pl-kos\">&gt;<\/span>` <span class=\"pl-kos\">{<\/span>\r\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"&lt;spooky&gt;\"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toUpperCase<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s\">\"&lt;\/spooky&gt;\"<\/span>\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p>You&#8217;d think this would be it, but <code>str.toUpperCase<\/code> actually converts the <code>str<\/code> to a string! Tricky, you&#8217;d need to think creatively here and you have three options:<\/p>\n<ol>\n<li>Use an <code>as<\/code> because you know better than the compiler:\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">makeTitle<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Str<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: <span class=\"pl-smi\">Str<\/span><span class=\"pl-kos\">)<\/span>: `<span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">spooky<\/span><span class=\"pl-c1\">&gt;<\/span>${<span class=\"pl-smi\">Uppercase<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">Str<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-smi\">spooky<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-s\">` {<\/span>\r\n<span class=\"pl-s\">    const shouty = str.toUpperCase() as Uppercase&lt;Str&gt;<\/span>\r\n<span class=\"pl-s\">    return `<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-s1\">spooky<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-s1\">$<\/span><span class=\"pl-kos\">{<\/span>shouty<span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span>spooky&gt;`\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<\/li>\n<li>Override <code>toUpperCase<\/code> to support template literals:\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">String<\/span> <span class=\"pl-kos\">{<\/span>\r\n    <span class=\"pl-c1\">toUpperCase<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">T<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span>: <span class=\"pl-smi\">T<\/span><span class=\"pl-kos\">)<\/span> : <span class=\"pl-smi\">Uppercase<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">T<\/span><span class=\"pl-kos\">&gt;<\/span>\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<\/li>\n<li>Or create a new function which supports template literals.<\/li>\n<\/ol>\n<p>This would take the <code>\"party\"<\/code> used on line 19 and convert it to <code>\"&lt;spooky&gt;PARTY&lt;\/spooky&gt;\"<\/code>. That change would remove the compiler error on <code>addTadaEmoji<\/code>.<\/p>\n<p>The second part was about re-using the type parameters inside argument for the function. The challenge started with:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">setupFooter<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\r\n    <span class=\"pl-c\">\/\/ validate string etc<\/span>\r\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span> \r\n        <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">split<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\",\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span>\r\n        <span class=\"pl-c1\">date<\/span>: <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">split<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\",\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span>\r\n        <span class=\"pl-c1\">address<\/span>: <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">split<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\",\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">]<\/span>\r\n    <span class=\"pl-kos\">}<\/span>\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p>Would lose string literals passed in as <code>str<\/code>. You knew ahead of time that there were three separate parts of information you were interested in:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">setupFooter<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Name<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Date<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Address<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><\/pre>\n<\/div>\n<p>These could then be used inside the replacement for <code>string<\/code>:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">setupFooter<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Name<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Date<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Address<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: `${<span class=\"pl-smi\">Name<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span><span class=\"pl-s1\">$<\/span><span class=\"pl-kos\">{<\/span>Date<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span><span class=\"pl-s1\">$<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">Address<\/span><span class=\"pl-kos\">}<\/span>`<span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><\/pre>\n<\/div>\n<p>Which would correctly set up these variables for re-use later:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">setupFooter<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Name<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Date<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Address<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">str<\/span>: `${<span class=\"pl-smi\">Name<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span><span class=\"pl-s1\">$<\/span><span class=\"pl-kos\">{<\/span>Date<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span><span class=\"pl-s1\">$<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">Address<\/span><span class=\"pl-kos\">}<\/span>`<span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\r\n    <span class=\"pl-c\">\/\/ validate string etc<\/span>\r\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span> \r\n        <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">split<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\",\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-smi\">Name<\/span><span class=\"pl-kos\">,<\/span>\r\n        <span class=\"pl-c1\">date<\/span>: <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">split<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\",\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-smi\">Date<\/span><span class=\"pl-kos\">,<\/span>\r\n        <span class=\"pl-c1\">address<\/span>: <span class=\"pl-s1\">str<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">split<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\",\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-smi\">Address<\/span>\r\n    <span class=\"pl-kos\">}<\/span>\r\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p>Successfully completing this challenge would show that <code>name<\/code>, <code>date<\/code> and <code>address<\/code> were not <code>string<\/code> but the strings passed in.<\/p>\n<p><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\" rel=\"nofollow\">Our answer<\/a>.<\/p>\n<h2>The Challenge<\/h2>\n<h3>Beginner\/Learner Challenge<\/h3>\n<p><a href=\"https:\/\/gist.github.com\/gists\/927ccc66ae3022dc64c4f650109b937a\" rel=\"nofollow\">Make some candy bowls. Then make some very specific bowls<\/a>.<\/p>\n<h3>Intermediate\/Advanced Challenge<\/h3>\n<p><a href=\"https:\/\/gist.github.com\/gists\/927ccc66ae3022dc64c4f650109b937a\" rel=\"nofollow\">Run a set of pumpkin competitions<\/a><\/p>\n<h2>How To Share Your Solution<\/h2>\n<p>Once you feel you have completed the challenge, you will need to select the <strong>Share<\/strong> button in the playground. This will automatically copy a playground URL to your clipboard.<\/p>\n<p>Then either:<\/p>\n<ul>\n<li>Go to Twitter, and create a tweet about the challenge, add the link to your code and mention the <a href=\"https:\/\/twitter.com\/typescript\" rel=\"nofollow\">@TypeScript<\/a> Twitter account with the hashtag <a href=\"https:\/\/twitter.com\/search?q=%23TypeOrTreat\" rel=\"nofollow\">#TypeOrTreat<\/a>.<\/li>\n<li>Leave us a comment with your feedback on the <a href=\"https:\/\/dev.to\/typescript\" rel=\"nofollow\">dev.to<\/a> post, or in this post.<\/li>\n<\/ul>\n<h3>Best Resources for Additional Help<\/h3>\n<p>If you need additional help you can utilize the following:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/intro.html\" rel=\"nofollow\">The New TypeScript Handbook<\/a><\/li>\n<li>The <a href=\"https:\/\/discord.com\/invite\/typescript\" rel=\"nofollow\">TypeScript Community Discord<\/a><\/li>\n<li>The comments on each <a href=\"https:\/\/dev.to\/typescript\" rel=\"nofollow\">Dev.to<\/a> post!<\/li>\n<li>Our previous <a href=\"https:\/\/www.typescriptlang.org\/play\/#gist\/303ebff59a6fc37f88c86e86dbdeb0e8-0\" rel=\"nofollow\"><code>Type | Treat<\/code> 2020 challenges<\/a><\/li>\n<\/ul>\n<p>Happy Typing \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Type | Treat Challenge 4 Welcome to the fourth Type | Treat 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&#8217;re on day four, which means going over the answers from yesterday and have 2 new challenges. Yesterday&#8217;s Solution [&hellip;]<\/p>\n","protected":false},"author":6925,"featured_media":3143,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3168","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typescript"],"acf":[],"blog_post_summary":"<p>Type | Treat Challenge 4 Welcome to the fourth Type | Treat 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&#8217;re on day four, which means going over the answers from yesterday and have 2 new challenges. Yesterday&#8217;s Solution [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/posts\/3168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/users\/6925"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/comments?post=3168"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/posts\/3168\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/media\/3143"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/media?parent=3168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/categories?post=3168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/tags?post=3168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}