{"id":10974,"date":"2022-09-30T19:06:33","date_gmt":"2022-09-30T17:06:33","guid":{"rendered":"https:\/\/vived.io\/?p=10974"},"modified":"2022-10-01T12:31:34","modified_gmt":"2022-10-01T10:31:34","slug":"satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/","title":{"rendered":"Satysfakcjonuj\u0105cy TypeScript 4.9 &#8211; Frontend Weekly vol. 107"},"content":{"rendered":"\n<h2 id=\"1-typescript-4-9-beta\" data-num=1>1. TypeScript 4.9 Beta<\/h2>\n\n\n\n<p>Je\u015bli \u015bledzicie nasze przegl\u0105dy od d\u0142u\u017cszego czasu, to pewnie wiecie jak wygl\u0105da m\u00f3j entuzjazm je\u015bli chodzi o kolejne wersje TypeScrpt. W ostatnich latach j\u0119zyk bardzo dojrza\u0142 i wprowadzane do niego nowo\u015bci s\u0105 ju\u017c raczej kosmetyczne. Kiedy zobaczy\u0142em bet\u0119 TypeScript 4.9 nie spodziewa\u0142em si\u0119 wi\u0119c niczego szczeg\u00f3lnego. Oj, jak bardzo si\u0119 myli\u0142em! TypeScript 4.9 po raz pierwszy od d\u0142u\u017cszego czasu wprowadza nowo\u015b\u0107 do sk\u0142adni j\u0119zyka: operator satisfies.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"360\" height=\"268\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6v9rzo.gif\" alt=\"\" class=\"wp-image-10975\"\/><\/figure><\/div>\n\n\n<p>T\u0142umacz\u0105c dzia\u0142anie nowego operatora pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem z notatki od Microsoftu. Za\u0142\u00f3\u017cmy, \u017ce potrzebujemy otypowa\u0107 nast\u0119puj\u0105cy kod:<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ Each property can be a string or an RGB tuple.\nconst palette = {\n    red: [255, 0, 0],\n    green: &quot;#00ff00&quot;,\n    blue: [0, 0, 255]\n};\n\n\/\/ We want to be able to use array methods on &#039;red&#039;...\nconst redComponent = palette.red.at(0);\n\n\/\/ or string methods on &#039;green&#039;...\nconst greenNormalized = palette.green.toUpperCase();<\/code><\/pre>\n\n\n\n<p>W pierwszej chwili do g\u0142owy przyj\u015b\u0107 mo\u017ce zdefiniowanie typu Color oraz wykorzystanie typu Record. Niestety, w takim przypadku zmuszeni jeste\u015bmy wykonywa\u0107 niebezpieczn\u0105 operacj\u0119 rzutowania:<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type Color = &quot;red&quot; | &quot;green&quot; | &quot;blue&quot;;\ntype RGB = [red: number, green: number, blue: number];\n\ntype Palette = Record&lt;Color, string | RGB&gt;\n\nconst palette: Palette = {\n    red: [255, 0, 0],\n    green: &quot;#00ff00&quot;,\n    blue: [0, 0, 255]\n};\n\n\/\/ We want to be able to use array methods on &#039;red&#039;...\nconst redComponent = (palette.red as RGB).at(0);\n\n\/\/ or string methods on &#039;green&#039;...\nconst greenNormalized = (palette.green as string).toUpperCase();<\/code><\/pre>\n\n\n\n<p>Aby usun\u0105\u0107 rzutowanie, mo\u017cemy w definicji typu zawrze\u0107 spos\u00f3b w jaki b\u0119dzie on definiowany. W naszym przypadku nie jest to mo\u017ce najgorszy pomys\u0142, ale zobaczcie sami, ile dodatkowego kodu musimy wygenerowa\u0107, nie m\u00f3wi\u0105c ju\u017c o du\u017co mniejszej elastyczno\u015bci.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type StringColor =  &quot;green&quot;;\ntype RGBColor = &quot;red&quot; | &quot;blue&quot;;\ntype RGB = [red: number, green: number, blue: number];\n\ntype StringColorPalette = Record&lt;StringColor, string&gt;;\ntype RGBColorPalette = Record&lt;RGBColor, RGB&gt;;\ntype Palette = StringColorPalette &amp; RGBColorPalette;\n\nconst palette: Palette = {\n    red: [255, 0, 0],\n    green: &quot;#00ff00&quot;,\n    blue: [0, 0, 255]\n};\n\nconst redComponent = palette.red.at(0);\nconst greenNormalized = palette.green.toUpperCase();<\/code><\/pre>\n\n\n\n<p>Obej\u015bciem tego problemu ma by\u0107 nowy operator satisfies, kt\u00f3ry b\u0119dzie walidowa\u0142 typ w momencie przypisania, ale nie b\u0119dzie mia\u0142 wp\u0142ywu na typ ewaluowany przez TypeScript. Brzmi skomplikowanie, ale na prostym przyk\u0142adzie dobrze wida\u0107, o co chodzi:<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type Color = &quot;red&quot; | &quot;green&quot; | &quot;blue&quot;;\ntype RGB = [red: number, green: number, blue: number];\n\ntype Palette = Record&lt;Color, string | RGB&gt;\n\nconst palette = {\n    red: [255, 0, 0],\n    green: &quot;#00ff00&quot;,\n    blue: [0, 0, 255]\n} satisfies Palette;\n\n\/\/ Both of these methods are still accessible!\nconst redComponent = palette.red.at(0);\nconst greenNormalized = palette.green.toUpperCase();\n\n\/\/ \u2014-----------------------------------\n\/\/ Example errors caught by satisfies\n\/\/  \u2014-----------------------------------\n\nconst spelloPalette = {\n    red: [255, 0, 0],\n    green: &quot;#00ff00&quot;,\n    bleu: [0, 0, 255] \/\/ Such typos are now caught\n} satisfies Palette;\n\n\/\/ Missing properties are now caught\nconst missingColorPalette = {\n    red: [255, 0, 0],\n    bleu: [0, 0, 255]\n} satisfies Palette;\n\nconst wrongColorTypePalette = {\n    red: [255, 0], \/\/ Such typos are now also caught\n    green: &quot;#00ff00&quot;,\n    bleu: [0, 0, 255]\n} satisfies Palette;<\/code><\/pre>\n\n\n\n<p>Oczywi\u015bcie, to nie koniec nowo\u015bci zmierzaj\u0105cych do TypeScript 4.9. Reszt\u0119 listy, stanowi\u0105 ju\u017c bardziej typowe dla TypeScript drobne usprawnienia jak lepsze zaw\u0119\u017canie typ\u00f3w przy u\u017cyciu operatora in czy zwracanie b\u0142\u0119d\u00f3w przy bezpo\u015brednich por\u00f3wnaniach z obiektem NaN. Je\u015bli jeste\u015bcie g\u0142odni szczeg\u00f3\u0142\u00f3w, to jak zwykle notka dostarczona przez Microsoft jest miejscem, w kt\u00f3re powinni\u015bcie si\u0119 uda\u0107 (patrz \u017ar\u00f3d\u0142a).<\/p>\n\n\n\n<p>Na razie TypeScript 4.9 otrzyma\u0142 pierwsz\u0105 wersj\u0119 beta. Patrz\u0105c na cykl pojawiania si\u0119 kolejnych wersji j\u0119zyka od Microsoftu, stabilnej wersji oczekiwa\u0107 mo\u017cemy w okolicach listopada. Trzymamy r\u00f3wnie\u017c kciuki, \u017ceby nowy operator przetrwa\u0142 do tego czasu. Przy okazji poprzednich wersji j\u0119zyka zdarza\u0142y si\u0119 ju\u017c funkcjonalno\u015bci, kt\u00f3re owej \u015bcie\u017cki nie przetrwa\u0142y.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/giphy-5.gif\" alt=\"\" class=\"wp-image-10979\"\/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8-beta\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8-beta\/<\/a><\/p>\n\n\n\n<h2 id=\"2-web-almanach-2022\" data-num=2>2. Web Almanach 2022<\/h2>\n\n\n\n<p>Web Almanach, to wraz z StackoOverflow Survey i The State of JS najwa\u017cniejsze raporty, kt\u00f3re pozwalaj\u0105 nam wyci\u0105ga\u0107 wnioski na temat naszego frontendowego \u015bwiatka. Web Almanach od pozosta\u0142ych wyr\u00f3\u017cnia fakt, \u017ce zamiast na opiniach deweloper\u00f3w, opiera si\u0119 on na twardych danych zebranych podczas scrappowania internetu. No i w odr\u00f3\u017cnieniu od pozosta\u0142ych nie da si\u0119 go w ca\u0142o\u015bci przeczyta\u0107 podczas jednego posiedzenia przy porannej kawce.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"337\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_6337229fd8a0d.png\"><\/p>\n\n\n\n<p>Sk\u0142ama\u0142bym, gdybym powiedzia\u0142, \u017ce ja mia\u0142em ju\u017c czas aby samodzielnie przebrn\u0105\u0107 przez raport od dechy do dechy. Jedyna na co starczy\u0142o mi czasu, to pobie\u017cne przegl\u0105dni\u0119cie najbardziej interesuj\u0105cych mnie rozdzia\u0142\u00f3w. Od dechy do dechy uda\u0142o mi si\u0119 natomiast przebrn\u0105\u0107 przez twitterowy w\u0105tek Stefana Judis, kt\u00f3ry skumulowa\u0142 ca\u0142\u0105 mas\u0119 ciekawostek. Na zach\u0119t\u0119 poni\u017cej znajdziecie kilka z nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Najwi\u0119kszy zescrappowany stylesheet mia\u0142 62MB (!)<\/li><li>Ponad 70% stron do definiowania rozmiary czcionek nadal u\u017cywa pikseli<\/li><li>Najmniej popularnym kolorem w plikach CSS jest `mediumspringgreen`<\/li><li>Mediana pobieranych przez aplikacj\u0119 skrypt\u00f3w wynosi 20<\/li><li>jquery nadal jest kr\u00f3lem internetu (korzysta z niego 81% stron). Je\u015bli React kiedykolwiek chce zaj\u0105\u0107 jego miejsce, to przed nim piekielnie d\u0142uga droga (obecnie u\u017cywa go 8% stron)<\/li><li>Tylko 2% desktopowych aplikacji korzysta z custom elements.<\/li><\/ul>\n\n\n\n<p>A je\u015bli te\u017c szukacie dobrego skr\u00f3tu, kt\u00f3ry dla odmiany da si\u0119 przeczyta\u0107 przy porannej kawie, to tutaj znajdziecie ca\u0142y w\u0105tek.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\"><p lang=\"en\" dir=\"ltr\">.<a href=\"https:\/\/twitter.com\/HTTPArchive?ref_src=twsrc%5Etfw\">@HTTPArchive<\/a>&#39;s annual state of the web report \u2014 the Web Almanac \u2014 is out! <br><br>As every year, I&#39;ll give it a read and share interesting facts below&#8230;<\/p>&mdash; Stefan Judis (@stefanjudis) <a href=\"https:\/\/twitter.com\/stefanjudis\/status\/1574692009926967297?ref_src=twsrc%5Etfw\">September 27, 2022<\/a><\/blockquote><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/almanac.httparchive.org\/en\/2022\/\">https:\/\/almanac.httparchive.org\/en\/2022\/<\/a><\/p>\n\n\n\n<h2 id=\"bonus-nowa-generacja-frontendowych-frameworkow\" data-num=3>Bonus: nowa generacja frontendowych framework\u00f3w<\/h2>\n\n\n\n<p>Je\u015bli regularnie \u015bledzicie nasze przegl\u0105dy, to na pewno jeste\u015bcie na bie\u017c\u0105co z nowo\u015bciami takimi jak Remix, Astro czy Qwik. Czasem jednak warto na chwil\u0119 si\u0119 zatrzyma\u0107 i zastanowi\u0107 sk\u0105d przychodzimy i dok\u0105d zmierzamy. Takiej zadumie poddali si\u0119 autorzy bloga frontendmastery, kt\u00f3rzy wysuwaj\u0105 tez\u0119 m\u00f3wi\u0105c\u0105, \u017ce rozpoczyna si\u0119 w\u0142a\u015bnie nowa era frontendowych framework\u00f3w. Je\u015bli szukacie lekkiej lektury w sam raz na pi\u0105tkowy wiecz\u00f3r&nbsp; (troch\u0119 l\u017cejszej ni\u017c Web Almanach 2022), to nie musicie dalej szuka\u0107.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"339\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_633722a02e94b.png\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/frontendmastery.com\/posts\/the-new-wave-of-javascript-web-frameworks\/\">https:\/\/frontendmastery.com\/posts\/the-new-wave-of-javascript-web-frameworks\/<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Przysz\u0142otygodniowe Frontend Weekly zostaje odwo\u0142ane, ze wzgl\u0119du na m\u00f3j urlop. Je\u015bli boicie si\u0119 o swoje samopoczucie ze wzgl\u0119du na brak cotygodniowego zastrzyku nowo\u015bci, to ca\u0142kiem niez\u0142\u0105 dawk\u0119 znajdziecie w aplikacji (co prawda bez mojego umiarkowanie spostrzegawczego i umiarkowanie zabawnego komentarza, ale zawsze \ud83d\ude09)<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"420\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-13.jpeg\" alt=\"\" class=\"wp-image-10981\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-13.jpeg 600w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-13-300x210.jpeg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TypeScirpt ju\u017c dawno przesta\u0142 zaskakiwa\u0107? Nic bardziej mylnego! Opublikowana w tym tygodniu beta TypeScript 4.9 wprowadza zupe\u0142nie nowy operator, kt\u00f3ry otwiera przed nami morze mo\u017cliwo\u015bci\u2026 <\/p>\n","protected":false},"author":12,"featured_media":11047,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[364],"class_list":["post-10974","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl","tag-typescript-pl"],"acf":{"feature_image_visible":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png","feature_image_blog":{"ID":10985,"id":10985,"title":"6va61j","filename":"6va61j.jpeg","filesize":46564,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","link":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/6va61j\/","alt":"","author":"12","description":"","caption":"","name":"6va61j","status":"inherit","uploaded_to":10974,"date":"2022-09-30 17:01:28","modified":"2022-09-30 17:01:28","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":620,"height":412,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j-150x150.jpeg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j-300x199.jpeg","medium-width":300,"medium-height":199,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","medium_large-width":620,"medium_large-height":412,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","large-width":620,"large-height":412,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","1536x1536-width":620,"1536x1536-height":412,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","2048x2048-width":620,"2048x2048-height":412,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":199,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","gform-image-choice-md-width":400,"gform-image-choice-md-height":266,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6va61j.jpeg","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":399}},"estimated_reading_time":"5"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Satysfakcjonuj\u0105cy TypeScript 4.9 - Frontend Weekly vol. 107 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Satysfakcjonuj\u0105cy TypeScript 4.9 - Frontend Weekly vol. 107 - Vived\" \/>\n<meta property=\"og:description\" content=\"TypeScirpt ju\u017c dawno przesta\u0142 zaskakiwa\u0107? Nic bardziej mylnego! Opublikowana w tym tygodniu beta TypeScript 4.9 wprowadza zupe\u0142nie nowy operator, kt\u00f3ry otwiera przed nami morze mo\u017cliwo\u015bci\u2026\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-30T17:06:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-01T10:31:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tomasz Borowicz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Satysfakcjonuj\u0105cy TypeScript 4.9 &#8211; Frontend Weekly vol. 107\",\"datePublished\":\"2022-09-30T17:06:33+00:00\",\"dateModified\":\"2022-10-01T10:31:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\"},\"wordCount\":780,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png\",\"keywords\":[\"typescript\"],\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\",\"url\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\",\"name\":\"Satysfakcjonuj\u0105cy TypeScript 4.9 - Frontend Weekly vol. 107 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png\",\"datePublished\":\"2022-09-30T17:06:33+00:00\",\"dateModified\":\"2022-10-01T10:31:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Satysfakcjonuj\u0105cy TypeScript 4.9 &#8211; Frontend Weekly vol. 107\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\",\"name\":\"Tomasz Borowicz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g\",\"caption\":\"Tomasz Borowicz\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Satysfakcjonuj\u0105cy TypeScript 4.9 - Frontend Weekly vol. 107 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/","og_locale":"pl_PL","og_type":"article","og_title":"Satysfakcjonuj\u0105cy TypeScript 4.9 - Frontend Weekly vol. 107 - Vived","og_description":"TypeScirpt ju\u017c dawno przesta\u0142 zaskakiwa\u0107? Nic bardziej mylnego! Opublikowana w tym tygodniu beta TypeScript 4.9 wprowadza zupe\u0142nie nowy operator, kt\u00f3ry otwiera przed nami morze mo\u017cliwo\u015bci\u2026","og_url":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/","og_site_name":"Vived","article_published_time":"2022-09-30T17:06:33+00:00","article_modified_time":"2022-10-01T10:31:34+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png","type":"image\/png"}],"author":"Tomasz Borowicz","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Satysfakcjonuj\u0105cy TypeScript 4.9 &#8211; Frontend Weekly vol. 107","datePublished":"2022-09-30T17:06:33+00:00","dateModified":"2022-10-01T10:31:34+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/"},"wordCount":780,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png","keywords":["typescript"],"articleSection":["Frontend"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/","url":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/","name":"Satysfakcjonuj\u0105cy TypeScript 4.9 - Frontend Weekly vol. 107 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png","datePublished":"2022-09-30T17:06:33+00:00","dateModified":"2022-10-01T10:31:34+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/PL-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/satysfakcjonujacy-typescript-4-9-fronend-weekly-vol-108\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Satysfakcjonuj\u0105cy TypeScript 4.9 &#8211; Frontend Weekly vol. 107"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb","name":"Tomasz Borowicz","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g","caption":"Tomasz Borowicz"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>1. TypeScript 4.9 Beta<\/h2>\n","innerContent":["\n<h2>1. TypeScript 4.9 Beta<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli \u015bledzicie nasze przegl\u0105dy od d\u0142u\u017cszego czasu, to pewnie wiecie jak wygl\u0105da m\u00f3j entuzjazm je\u015bli chodzi o kolejne wersje TypeScrpt. W ostatnich latach j\u0119zyk bardzo dojrza\u0142 i wprowadzane do niego nowo\u015bci s\u0105 ju\u017c raczej kosmetyczne. Kiedy zobaczy\u0142em bet\u0119 TypeScript 4.9 nie spodziewa\u0142em si\u0119 wi\u0119c niczego szczeg\u00f3lnego. Oj, jak bardzo si\u0119 myli\u0142em! TypeScript 4.9 po raz pierwszy od d\u0142u\u017cszego czasu wprowadza nowo\u015b\u0107 do sk\u0142adni j\u0119zyka: operator satisfies.&nbsp;<\/p>\n","innerContent":["\n<p>Je\u015bli \u015bledzicie nasze przegl\u0105dy od d\u0142u\u017cszego czasu, to pewnie wiecie jak wygl\u0105da m\u00f3j entuzjazm je\u015bli chodzi o kolejne wersje TypeScrpt. W ostatnich latach j\u0119zyk bardzo dojrza\u0142 i wprowadzane do niego nowo\u015bci s\u0105 ju\u017c raczej kosmetyczne. Kiedy zobaczy\u0142em bet\u0119 TypeScript 4.9 nie spodziewa\u0142em si\u0119 wi\u0119c niczego szczeg\u00f3lnego. Oj, jak bardzo si\u0119 myli\u0142em! TypeScript 4.9 po raz pierwszy od d\u0142u\u017cszego czasu wprowadza nowo\u015b\u0107 do sk\u0142adni j\u0119zyka: operator satisfies.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10975,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6v9rzo.gif\" alt=\"\" class=\"wp-image-10975\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/6v9rzo.gif\" alt=\"\" class=\"wp-image-10975\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>T\u0142umacz\u0105c dzia\u0142anie nowego operatora pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem z notatki od Microsoftu. Za\u0142\u00f3\u017cmy, \u017ce potrzebujemy otypowa\u0107 nast\u0119puj\u0105cy kod:<\/p>\n","innerContent":["\n<p>T\u0142umacz\u0105c dzia\u0142anie nowego operatora pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem z notatki od Microsoftu. Za\u0142\u00f3\u017cmy, \u017ce potrzebujemy otypowa\u0107 nast\u0119puj\u0105cy kod:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ Each property can be a string or an RGB tuple.\nconst palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n};\n\n\/\/ We want to be able to use array methods on 'red'...\nconst redComponent = palette.red.at(0);\n\n\/\/ or string methods on 'green'...\nconst greenNormalized = palette.green.toUpperCase();<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ Each property can be a string or an RGB tuple.\nconst palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n};\n\n\/\/ We want to be able to use array methods on 'red'...\nconst redComponent = palette.red.at(0);\n\n\/\/ or string methods on 'green'...\nconst greenNormalized = palette.green.toUpperCase();<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W pierwszej chwili do g\u0142owy przyj\u015b\u0107 mo\u017ce zdefiniowanie typu Color oraz wykorzystanie typu Record. Niestety, w takim przypadku zmuszeni jeste\u015bmy wykonywa\u0107 niebezpieczn\u0105 operacj\u0119 rzutowania:<\/p>\n","innerContent":["\n<p>W pierwszej chwili do g\u0142owy przyj\u015b\u0107 mo\u017ce zdefiniowanie typu Color oraz wykorzystanie typu Record. Niestety, w takim przypadku zmuszeni jeste\u015bmy wykonywa\u0107 niebezpieczn\u0105 operacj\u0119 rzutowania:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type Color = \"red\" | \"green\" | \"blue\";\ntype RGB = [red: number, green: number, blue: number];\n\ntype Palette = Record&lt;Color, string | RGB>\n\nconst palette: Palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n};\n\n\/\/ We want to be able to use array methods on 'red'...\nconst redComponent = (palette.red as RGB).at(0);\n\n\/\/ or string methods on 'green'...\nconst greenNormalized = (palette.green as string).toUpperCase();<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type Color = \"red\" | \"green\" | \"blue\";\ntype RGB = [red: number, green: number, blue: number];\n\ntype Palette = Record&lt;Color, string | RGB>\n\nconst palette: Palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n};\n\n\/\/ We want to be able to use array methods on 'red'...\nconst redComponent = (palette.red as RGB).at(0);\n\n\/\/ or string methods on 'green'...\nconst greenNormalized = (palette.green as string).toUpperCase();<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Aby usun\u0105\u0107 rzutowanie, mo\u017cemy w definicji typu zawrze\u0107 spos\u00f3b w jaki b\u0119dzie on definiowany. W naszym przypadku nie jest to mo\u017ce najgorszy pomys\u0142, ale zobaczcie sami, ile dodatkowego kodu musimy wygenerowa\u0107, nie m\u00f3wi\u0105c ju\u017c o du\u017co mniejszej elastyczno\u015bci.<\/p>\n","innerContent":["\n<p>Aby usun\u0105\u0107 rzutowanie, mo\u017cemy w definicji typu zawrze\u0107 spos\u00f3b w jaki b\u0119dzie on definiowany. W naszym przypadku nie jest to mo\u017ce najgorszy pomys\u0142, ale zobaczcie sami, ile dodatkowego kodu musimy wygenerowa\u0107, nie m\u00f3wi\u0105c ju\u017c o du\u017co mniejszej elastyczno\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type StringColor =  \"green\";\ntype RGBColor = \"red\" | \"blue\";\ntype RGB = [red: number, green: number, blue: number];\n\ntype StringColorPalette = Record&lt;StringColor, string>;\ntype RGBColorPalette = Record&lt;RGBColor, RGB>;\ntype Palette = StringColorPalette &amp; RGBColorPalette;\n\nconst palette: Palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n};\n\nconst redComponent = palette.red.at(0);\nconst greenNormalized = palette.green.toUpperCase();<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type StringColor =  \"green\";\ntype RGBColor = \"red\" | \"blue\";\ntype RGB = [red: number, green: number, blue: number];\n\ntype StringColorPalette = Record&lt;StringColor, string>;\ntype RGBColorPalette = Record&lt;RGBColor, RGB>;\ntype Palette = StringColorPalette &amp; RGBColorPalette;\n\nconst palette: Palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n};\n\nconst redComponent = palette.red.at(0);\nconst greenNormalized = palette.green.toUpperCase();<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Obej\u015bciem tego problemu ma by\u0107 nowy operator satisfies, kt\u00f3ry b\u0119dzie walidowa\u0142 typ w momencie przypisania, ale nie b\u0119dzie mia\u0142 wp\u0142ywu na typ ewaluowany przez TypeScript. Brzmi skomplikowanie, ale na prostym przyk\u0142adzie dobrze wida\u0107, o co chodzi:<\/p>\n","innerContent":["\n<p>Obej\u015bciem tego problemu ma by\u0107 nowy operator satisfies, kt\u00f3ry b\u0119dzie walidowa\u0142 typ w momencie przypisania, ale nie b\u0119dzie mia\u0142 wp\u0142ywu na typ ewaluowany przez TypeScript. Brzmi skomplikowanie, ale na prostym przyk\u0142adzie dobrze wida\u0107, o co chodzi:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type Color = \"red\" | \"green\" | \"blue\";\ntype RGB = [red: number, green: number, blue: number];\n\ntype Palette = Record&lt;Color, string | RGB>\n\nconst palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n} satisfies Palette;\n\n\/\/ Both of these methods are still accessible!\nconst redComponent = palette.red.at(0);\nconst greenNormalized = palette.green.toUpperCase();\n\n\/\/ \u2014-----------------------------------\n\/\/ Example errors caught by satisfies\n\/\/  \u2014-----------------------------------\n\nconst spelloPalette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    bleu: [0, 0, 255] \/\/ Such typos are now caught\n} satisfies Palette;\n\n\/\/ Missing properties are now caught\nconst missingColorPalette = {\n    red: [255, 0, 0],\n    bleu: [0, 0, 255]\n} satisfies Palette;\n\nconst wrongColorTypePalette = {\n    red: [255, 0], \/\/ Such typos are now also caught\n    green: \"#00ff00\",\n    bleu: [0, 0, 255]\n} satisfies Palette;<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type Color = \"red\" | \"green\" | \"blue\";\ntype RGB = [red: number, green: number, blue: number];\n\ntype Palette = Record&lt;Color, string | RGB>\n\nconst palette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    blue: [0, 0, 255]\n} satisfies Palette;\n\n\/\/ Both of these methods are still accessible!\nconst redComponent = palette.red.at(0);\nconst greenNormalized = palette.green.toUpperCase();\n\n\/\/ \u2014-----------------------------------\n\/\/ Example errors caught by satisfies\n\/\/  \u2014-----------------------------------\n\nconst spelloPalette = {\n    red: [255, 0, 0],\n    green: \"#00ff00\",\n    bleu: [0, 0, 255] \/\/ Such typos are now caught\n} satisfies Palette;\n\n\/\/ Missing properties are now caught\nconst missingColorPalette = {\n    red: [255, 0, 0],\n    bleu: [0, 0, 255]\n} satisfies Palette;\n\nconst wrongColorTypePalette = {\n    red: [255, 0], \/\/ Such typos are now also caught\n    green: \"#00ff00\",\n    bleu: [0, 0, 255]\n} satisfies Palette;<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, to nie koniec nowo\u015bci zmierzaj\u0105cych do TypeScript 4.9. Reszt\u0119 listy, stanowi\u0105 ju\u017c bardziej typowe dla TypeScript drobne usprawnienia jak lepsze zaw\u0119\u017canie typ\u00f3w przy u\u017cyciu operatora in czy zwracanie b\u0142\u0119d\u00f3w przy bezpo\u015brednich por\u00f3wnaniach z obiektem NaN. Je\u015bli jeste\u015bcie g\u0142odni szczeg\u00f3\u0142\u00f3w, to jak zwykle notka dostarczona przez Microsoft jest miejscem, w kt\u00f3re powinni\u015bcie si\u0119 uda\u0107 (patrz \u017ar\u00f3d\u0142a).<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, to nie koniec nowo\u015bci zmierzaj\u0105cych do TypeScript 4.9. Reszt\u0119 listy, stanowi\u0105 ju\u017c bardziej typowe dla TypeScript drobne usprawnienia jak lepsze zaw\u0119\u017canie typ\u00f3w przy u\u017cyciu operatora in czy zwracanie b\u0142\u0119d\u00f3w przy bezpo\u015brednich por\u00f3wnaniach z obiektem NaN. Je\u015bli jeste\u015bcie g\u0142odni szczeg\u00f3\u0142\u00f3w, to jak zwykle notka dostarczona przez Microsoft jest miejscem, w kt\u00f3re powinni\u015bcie si\u0119 uda\u0107 (patrz \u017ar\u00f3d\u0142a).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na razie TypeScript 4.9 otrzyma\u0142 pierwsz\u0105 wersj\u0119 beta. Patrz\u0105c na cykl pojawiania si\u0119 kolejnych wersji j\u0119zyka od Microsoftu, stabilnej wersji oczekiwa\u0107 mo\u017cemy w okolicach listopada. Trzymamy r\u00f3wnie\u017c kciuki, \u017ceby nowy operator przetrwa\u0142 do tego czasu. Przy okazji poprzednich wersji j\u0119zyka zdarza\u0142y si\u0119 ju\u017c funkcjonalno\u015bci, kt\u00f3re owej \u015bcie\u017cki nie przetrwa\u0142y.<\/p>\n","innerContent":["\n<p>Na razie TypeScript 4.9 otrzyma\u0142 pierwsz\u0105 wersj\u0119 beta. Patrz\u0105c na cykl pojawiania si\u0119 kolejnych wersji j\u0119zyka od Microsoftu, stabilnej wersji oczekiwa\u0107 mo\u017cemy w okolicach listopada. Trzymamy r\u00f3wnie\u017c kciuki, \u017ceby nowy operator przetrwa\u0142 do tego czasu. Przy okazji poprzednich wersji j\u0119zyka zdarza\u0142y si\u0119 ju\u017c funkcjonalno\u015bci, kt\u00f3re owej \u015bcie\u017cki nie przetrwa\u0142y.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10979,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/giphy-5.gif\" alt=\"\" class=\"wp-image-10979\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/giphy-5.gif\" alt=\"\" class=\"wp-image-10979\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8-beta\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8-beta\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8-beta\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8-beta\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Web Almanach 2022<\/h2>\n","innerContent":["\n<h2>2. Web Almanach 2022<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Web Almanach, to wraz z StackoOverflow Survey i The State of JS najwa\u017cniejsze raporty, kt\u00f3re pozwalaj\u0105 nam wyci\u0105ga\u0107 wnioski na temat naszego frontendowego \u015bwiatka. Web Almanach od pozosta\u0142ych wyr\u00f3\u017cnia fakt, \u017ce zamiast na opiniach deweloper\u00f3w, opiera si\u0119 on na twardych danych zebranych podczas scrappowania internetu. No i w odr\u00f3\u017cnieniu od pozosta\u0142ych nie da si\u0119 go w ca\u0142o\u015bci przeczyta\u0107 podczas jednego posiedzenia przy porannej kawce.<\/p>\n","innerContent":["\n<p>Web Almanach, to wraz z StackoOverflow Survey i The State of JS najwa\u017cniejsze raporty, kt\u00f3re pozwalaj\u0105 nam wyci\u0105ga\u0107 wnioski na temat naszego frontendowego \u015bwiatka. Web Almanach od pozosta\u0142ych wyr\u00f3\u017cnia fakt, \u017ce zamiast na opiniach deweloper\u00f3w, opiera si\u0119 on na twardych danych zebranych podczas scrappowania internetu. No i w odr\u00f3\u017cnieniu od pozosta\u0142ych nie da si\u0119 go w ca\u0142o\u015bci przeczyta\u0107 podczas jednego posiedzenia przy porannej kawce.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<p class=\"has-text-align-center\"><img width=\"602\" height=\"337\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_6337229fd8a0d.png\"><\/p>\n","innerContent":["\n<p class=\"has-text-align-center\"><img width=\"602\" height=\"337\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_6337229fd8a0d.png\"><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sk\u0142ama\u0142bym, gdybym powiedzia\u0142, \u017ce ja mia\u0142em ju\u017c czas aby samodzielnie przebrn\u0105\u0107 przez raport od dechy do dechy. Jedyna na co starczy\u0142o mi czasu, to pobie\u017cne przegl\u0105dni\u0119cie najbardziej interesuj\u0105cych mnie rozdzia\u0142\u00f3w. Od dechy do dechy uda\u0142o mi si\u0119 natomiast przebrn\u0105\u0107 przez twitterowy w\u0105tek Stefana Judis, kt\u00f3ry skumulowa\u0142 ca\u0142\u0105 mas\u0119 ciekawostek. Na zach\u0119t\u0119 poni\u017cej znajdziecie kilka z nich:<\/p>\n","innerContent":["\n<p>Sk\u0142ama\u0142bym, gdybym powiedzia\u0142, \u017ce ja mia\u0142em ju\u017c czas aby samodzielnie przebrn\u0105\u0107 przez raport od dechy do dechy. Jedyna na co starczy\u0142o mi czasu, to pobie\u017cne przegl\u0105dni\u0119cie najbardziej interesuj\u0105cych mnie rozdzia\u0142\u00f3w. Od dechy do dechy uda\u0142o mi si\u0119 natomiast przebrn\u0105\u0107 przez twitterowy w\u0105tek Stefana Judis, kt\u00f3ry skumulowa\u0142 ca\u0142\u0105 mas\u0119 ciekawostek. Na zach\u0119t\u0119 poni\u017cej znajdziecie kilka z nich:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li>Najwi\u0119kszy zescrappowany stylesheet mia\u0142 62MB (!)<\/li><li>Ponad 70% stron do definiowania rozmiary czcionek nadal u\u017cywa pikseli<\/li><li>Najmniej popularnym kolorem w plikach CSS jest `mediumspringgreen`<\/li><li>Mediana pobieranych przez aplikacj\u0119 skrypt\u00f3w wynosi 20<\/li><li>jquery nadal jest kr\u00f3lem internetu (korzysta z niego 81% stron). Je\u015bli React kiedykolwiek chce zaj\u0105\u0107 jego miejsce, to przed nim piekielnie d\u0142uga droga (obecnie u\u017cywa go 8% stron)<\/li><li>Tylko 2% desktopowych aplikacji korzysta z custom elements.<\/li><\/ul>\n","innerContent":["\n<ul><li>Najwi\u0119kszy zescrappowany stylesheet mia\u0142 62MB (!)<\/li><li>Ponad 70% stron do definiowania rozmiary czcionek nadal u\u017cywa pikseli<\/li><li>Najmniej popularnym kolorem w plikach CSS jest `mediumspringgreen`<\/li><li>Mediana pobieranych przez aplikacj\u0119 skrypt\u00f3w wynosi 20<\/li><li>jquery nadal jest kr\u00f3lem internetu (korzysta z niego 81% stron). Je\u015bli React kiedykolwiek chce zaj\u0105\u0107 jego miejsce, to przed nim piekielnie d\u0142uga droga (obecnie u\u017cywa go 8% stron)<\/li><li>Tylko 2% desktopowych aplikacji korzysta z custom elements.<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A je\u015bli te\u017c szukacie dobrego skr\u00f3tu, kt\u00f3ry dla odmiany da si\u0119 przeczyta\u0107 przy porannej kawie, to tutaj znajdziecie ca\u0142y w\u0105tek.<\/p>\n","innerContent":["\n<p>A je\u015bli te\u017c szukacie dobrego skr\u00f3tu, kt\u00f3ry dla odmiany da si\u0119 przeczyta\u0107 przy porannej kawie, to tutaj znajdziecie ca\u0142y w\u0105tek.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/twitter.com\/stefanjudis\/status\/1574692009926967297","type":"rich","providerNameSlug":"twitter","responsive":true,"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/twitter.com\/stefanjudis\/status\/1574692009926967297\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/twitter.com\/stefanjudis\/status\/1574692009926967297\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/almanac.httparchive.org\/en\/2022\/\">https:\/\/almanac.httparchive.org\/en\/2022\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/almanac.httparchive.org\/en\/2022\/\">https:\/\/almanac.httparchive.org\/en\/2022\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Bonus: nowa generacja frontendowych framework\u00f3w<\/h2>\n","innerContent":["\n<h2>Bonus: nowa generacja frontendowych framework\u00f3w<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli regularnie \u015bledzicie nasze przegl\u0105dy, to na pewno jeste\u015bcie na bie\u017c\u0105co z nowo\u015bciami takimi jak Remix, Astro czy Qwik. Czasem jednak warto na chwil\u0119 si\u0119 zatrzyma\u0107 i zastanowi\u0107 sk\u0105d przychodzimy i dok\u0105d zmierzamy. Takiej zadumie poddali si\u0119 autorzy bloga frontendmastery, kt\u00f3rzy wysuwaj\u0105 tez\u0119 m\u00f3wi\u0105c\u0105, \u017ce rozpoczyna si\u0119 w\u0142a\u015bnie nowa era frontendowych framework\u00f3w. Je\u015bli szukacie lekkiej lektury w sam raz na pi\u0105tkowy wiecz\u00f3r&nbsp; (troch\u0119 l\u017cejszej ni\u017c Web Almanach 2022), to nie musicie dalej szuka\u0107.<\/p>\n","innerContent":["\n<p>Je\u015bli regularnie \u015bledzicie nasze przegl\u0105dy, to na pewno jeste\u015bcie na bie\u017c\u0105co z nowo\u015bciami takimi jak Remix, Astro czy Qwik. Czasem jednak warto na chwil\u0119 si\u0119 zatrzyma\u0107 i zastanowi\u0107 sk\u0105d przychodzimy i dok\u0105d zmierzamy. Takiej zadumie poddali si\u0119 autorzy bloga frontendmastery, kt\u00f3rzy wysuwaj\u0105 tez\u0119 m\u00f3wi\u0105c\u0105, \u017ce rozpoczyna si\u0119 w\u0142a\u015bnie nowa era frontendowych framework\u00f3w. Je\u015bli szukacie lekkiej lektury w sam raz na pi\u0105tkowy wiecz\u00f3r&nbsp; (troch\u0119 l\u017cejszej ni\u017c Web Almanach 2022), to nie musicie dalej szuka\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<p class=\"has-text-align-center\"><img width=\"602\" height=\"339\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_633722a02e94b.png\"><\/p>\n","innerContent":["\n<p class=\"has-text-align-center\"><img width=\"602\" height=\"339\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_633722a02e94b.png\"><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/frontendmastery.com\/posts\/the-new-wave-of-javascript-web-frameworks\/\">https:\/\/frontendmastery.com\/posts\/the-new-wave-of-javascript-web-frameworks\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/frontendmastery.com\/posts\/the-new-wave-of-javascript-web-frameworks\/\">https:\/\/frontendmastery.com\/posts\/the-new-wave-of-javascript-web-frameworks\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przysz\u0142otygodniowe Frontend Weekly zostaje odwo\u0142ane, ze wzgl\u0119du na m\u00f3j urlop. Je\u015bli boicie si\u0119 o swoje samopoczucie ze wzgl\u0119du na brak cotygodniowego zastrzyku nowo\u015bci, to ca\u0142kiem niez\u0142\u0105 dawk\u0119 znajdziecie w aplikacji (co prawda bez mojego umiarkowanie spostrzegawczego i umiarkowanie zabawnego komentarza, ale zawsze \ud83d\ude09)<\/p>\n","innerContent":["\n<p>Przysz\u0142otygodniowe Frontend Weekly zostaje odwo\u0142ane, ze wzgl\u0119du na m\u00f3j urlop. Je\u015bli boicie si\u0119 o swoje samopoczucie ze wzgl\u0119du na brak cotygodniowego zastrzyku nowo\u015bci, to ca\u0142kiem niez\u0142\u0105 dawk\u0119 znajdziecie w aplikacji (co prawda bez mojego umiarkowanie spostrzegawczego i umiarkowanie zabawnego komentarza, ale zawsze \ud83d\ude09)<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10981,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-13.jpeg\" alt=\"\" class=\"wp-image-10981\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-13.jpeg\" alt=\"\" class=\"wp-image-10981\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><\/p>\n","innerContent":["\n<p><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=10974"}],"version-history":[{"count":23,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10974\/revisions"}],"predecessor-version":[{"id":11111,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10974\/revisions\/11111"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/11047"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10974"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10974"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}