{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/typescript-3-7","result":{"data":{"markdownRemark":{"html":"<p>Oto jest - TypeScript 3.7. Hurra!</p>\n<p>A co tym razem dostajemy?</p>\n<ol>\n<li><strong>Optional chaining</strong> - czyli ficzer znany choćby z C#. Dotychczas - aby uniknąć błędu z komunikatem <code class=\"language-text\">Cannot read property 'x' of undefined</code> - trzeba było <em>explicite</em> sprawdzać, czy dana zmienna jest <code class=\"language-text\">undefined</code> lub <code class=\"language-text\">null</code>. Teraz - wystarczy użyć operatora <code class=\"language-text\">?.</code>, który zrobi to sprawdzenie za nas. Innymi słowy - zamiast</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> x <span class=\"token operator\">=</span> foo <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> foo <span class=\"token operator\">===</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">:</span> foo<span class=\"token punctuation\">.</span>bar<span class=\"token punctuation\">.</span><span class=\"token function\">baz</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>można napisać po prostu</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> x <span class=\"token operator\">=</span> foo<span class=\"token operator\">?.</span>bar<span class=\"token punctuation\">.</span><span class=\"token function\">baz</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Niezłe, co nie?</p>\n<ol start=\"2\">\n<li><strong>Nullish Coalescing</strong> - znowu rzecz znana z C#. Jak łatwo przypisać do zmiennej wartość domyślną, na wypadek, gdyby podstawowa ścieżka skutkowała <code class=\"language-text\">undefined</code>? Dotychczas stosować musiałem sztuczkę z JavaScriptu, tj.:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> model <span class=\"token operator\">=</span> options<span class=\"token punctuation\">.</span>volume <span class=\"token operator\">||</span> <span class=\"token number\">0.5</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Jeśli w obiekcie <code class=\"language-text\">options</code> nie ma właściwości <code class=\"language-text\">volume</code> lub jest ona ustawiona na <code class=\"language-text\">undefined</code> - mogę mieć \"fallback\" do jakiejś tam wartości domyślnej (np. <code class=\"language-text\">0.5</code>). Problem jest jednak taki, że ten operator <code class=\"language-text\">||</code> \"wybiera\" prawą stronę, gdy lewa strona jest \"falsy\",czyli gdy np. ktoś ustawi <code class=\"language-text\">options.volume = 0</code>, to i tak zostanie wybrana prawa strona, czyli wartość domyślna.\nTen problem rozwiązuje właśnie \"nullish coalescing\" - czyli operator <code class=\"language-text\">??</code>. Dzięki temu powyższy przykład można opisać jako:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> model <span class=\"token operator\">=</span> options<span class=\"token punctuation\">.</span>volume <span class=\"token operator\">??</span> <span class=\"token number\">0.5</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>I w ten sposób problem \"falsy\" wartości po lewej stronie mamy rozwiązany.</p>\n<ol start=\"3\">\n<li><strong>Uncalled Function Checks</strong> - ile to już razy zdarzało się, że zamiast wywołania funkcji - użyłem samego odwołania się do niej, zwłaszcza w warunku w ifie. Mam na myśli:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>isAdministrator<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token operator\">...</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>zamiast tego</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span><span class=\"token function\">isAdministrator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token operator\">...</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>Co gorsza, kod w pierwszej opcji będzie się transpilował bez błędu, zawsze zwracając <code class=\"language-text\">true</code>, no bo właściwość, która jest funkcją zawsze jest \"truthy\". Tak było do teraz. Od wersji 3.7 w powyższej sytuacji dosteniemy błąd.</p>\n<ol start=\"4\">\n<li>\"\"Flatter Error Reporting** - tworząc coś z użyciem React i TS, często zdarza się, że zmieniamy coś w propsach komponentu. W miejscu, w którym z niego korzystamy, po takiej zmianie \"interfejsu\" komponentu, oczywiście pokazać się może błąd. Często jednak ten błąd jest tak bardzo nieczytelny - zwłaszcza, gdy zmiana w interfejsie jest głęboko - jakiś atrybut, do którego przyisujemy obiekt przyjmuje teraz obiekt o lekko innej strukturze. TypeScript 3.7 dostarcza teraz komunikatów bardziej \"spłaszczonych\", tj. konkretnie informujących, że w tym miejscu strutktury zagnieżdżonych obiektów jest \"rozjazd\".</li>\n</ol>\n<p>Ja się przesiadam na 3.7 jak najszybciej, a Ty?</p>\n<p>PS. Pełną listę zmian można znaleźć tu: <a href=\"https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/\">https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/</a></p>","excerpt":"Oto jest - TypeScript 3.7. Hurra! A co tym razem dostajemy? Optional chaining - czyli ficzer znany choćby z C#. Dotychczas - aby uniknąć błędu z komunikatem…","frontmatter":{"date":"12 November, 2019","path":"/blog/typescript-3-7","title":"TypeScript 3.7!"},"fields":{"readingTime":{"text":"3 min read"}}}},"pageContext":{}},"staticQueryHashes":["3649515864","63159454"]}