{"id":9738,"date":"2022-09-02T16:49:55","date_gmt":"2022-09-02T14:49:55","guid":{"rendered":"https:\/\/vived.io\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/"},"modified":"2022-09-19T13:16:23","modified_gmt":"2022-09-19T11:16:23","slug":"typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/","title":{"rendered":"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce &#8211; Frontend Weekly vol. 103"},"content":{"rendered":"\n<h2 id=\"1-typescript-4-8\" data-num=1>1. TypeScript 4.8<\/h2>\n\n<p>W zamierzch\u0142ych czasach ka\u017cda kolejna premiera TypeScript wzbudza\u0142a moj\u0105 ekscytacj\u0119. Optional Chaining, Template Literal Types, Type-Only Imports, Variadic Tuple Types &#8211; to by\u0142y funkcjonalno\u015bci o kt\u00f3rych czyta\u0142em z wypiekami na twarzy i nie mog\u0142em doczeka\u0107 si\u0119, a\u017c trafi\u0105 w moje r\u0119ce.<\/p>\n\n<p><\/p>\n\n<p class=\"has-text-align-center\"><img loading=\"lazy\" decoding=\"async\" width=\"346\" height=\"460\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_631218139ff40.jpg\"\/><\/p>\n\n<p>Ostatnimi czasy sporo si\u0119 jednak zmieni\u0142o. TypeScript sta\u0142 si\u0119 dojrza\u0142y j\u0119zykiem wi\u0119c ekscytuj\u0105ce nowo\u015bci sta\u0142y si\u0119 rzadko\u015bci\u0105. Nie inaczej jest te\u017c w przypadku najnowszego TypeScript 4.8, kt\u00f3ry skupia si\u0119 na lepszej obs\u0142udze kilku przypadk\u00f3w brzegowych oraz drobnych usprawnieniach wydajno\u015bci.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-22.jpeg\" alt=\"\" class=\"wp-image-9704\" width=\"464\" height=\"311\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-22.jpeg 610w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-22-300x201.jpeg 300w\" sizes=\"auto, (max-width: 464px) 100vw, 464px\" \/><\/figure><\/div>\n<p>Z dziennikarskiego obowi\u0105zku przytocz\u0119 Wam tutaj kilka najciekawszych moim zdaniem zmian. Je\u015bli jednak macie troch\u0119 wi\u0119cej czasu, to jak zwykle polecam zanurzy\u0107 si\u0119 w d\u0142ug\u0105 i dog\u0142\u0119bn\u0105 notatk\u0119, kt\u00f3r\u0105 przygotowa\u0142 Microsoft.<\/p>\n\n<p>Zacznijmy od usprawnie\u0144 Intersection Reduction oraz Union Compatibility. Pod t\u0105 skomplikowan\u0105 nazw\u0105 kryj\u0105 si\u0119 tak naprawd\u0119 dwie proste zmiany. Pierwsza z nich polega na uto\u017csamieniu typu unknown z uni\u0105 pustego obiektu, null i undefined.<\/p>\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">function f(x: unknown, y: {} | null | undefined) {\n    x = y; \/\/ always worked\n    y = x; \/\/ used to error, now works\n}<\/code><\/pre>\r\n\n<p>Druga zmiana polega na tym, \u017ce od teraz cz\u0119\u015b\u0107 wsp\u00f3lna mi\u0119dzy dowolnym typem obiektu i pustym obiektem b\u0119dzie rozwijana po prostu jako ten obiekt. Zmiana ta pozwoli\u0142a zredefiniowa\u0107 typ NonNullable. W po\u0142\u0105czeniu ze zmian\u0105 z poprzedniego akapitu pozwala to na kilku naprawd\u0119 zgrabnych usprawnie\u0144 w kodzie.<\/p>\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type NonNullable&lt;T&gt; = T &amp; {};\n\nfunction throwIfNullable&lt;T&gt;(value: T): NonNullable&lt;T&gt; {\n    if (value === undefined || value === null) {\n        throw Error(&quot;Nullable value!&quot;);\n    }\n\n    \/\/ Used to fail because &#039;T&#039; was not assignable to &#039;NonNullable&lt;T&gt;&#039;.\n    \/\/ Now narrows to &#039;T &amp; {}&#039; and succeeds because that&#039;s just &#039;NonNullable&lt;T&gt;&#039;.\n    return value;\n}<\/code><\/pre>\r\n\n<p>Na koniec zostawi\u0142em sobie nowo\u015b\u0107, kt\u00f3ra w pierwszej chwili sprawi\u0142a, \u017ce m\u00f3j m\u00f3zg zacz\u0105\u0142 lekko parowa\u0107. W du\u017cym uproszczeniu s\u0142owo kluczowe infer pozwala nam wyekstraktowa\u0107 kawa\u0142ek typu, tak aby wykorzysta\u0107 go p\u00f3\u017aniej, np. w Conditional Type. Od teraz b\u0119dzie mo\u017cna go wykorzystywa\u0107 r\u00f3wnie\u017c w Template String Type. Brzmi skomplikowanie i tak te\u017c wygl\u0105da.<\/p>\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ SomeNum used to be &#039;number&#039;; now it&#039;s &#039;100&#039;.\ntype SomeNum = &quot;100&quot; extends `${infer U extends number}` ? U : never;\n\n\/\/ SomeBigInt used to be &#039;bigint&#039;; now it&#039;s &#039;100n&#039;.\ntype SomeBigInt = &quot;100&quot; extends `${infer U extends bigint}` ? U : never;\n\n\/\/ SomeBool used to be &#039;boolean&#039;; now it&#039;s &#039;true&#039;.\ntype SomeBool = &quot;true&quot; extends `${infer U extends boolean}` ? U : never;<\/code><\/pre>\r\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-23.jpeg\" alt=\"\" class=\"wp-image-9706\" width=\"553\" height=\"368\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-23.jpeg 680w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-23-300x200.jpeg 300w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/figure><\/div>\n<p>Opr\u00f3cz opisanych przeze mnie nowo\u015bci, Microsoft przygotowa\u0142 te\u017c szereg bufix\u00f3w i usprawnie\u0144 wydajno\u015bci. Tak jak wspomina\u0142em, je\u015bli jeste\u015bcie zainteresowani szczeg\u00f3\u0142ami, to najlepiej zrobicie je\u015bli natychmiast przejdziecie do notatki towarzysz\u0105cej wydaniu, kt\u00f3r\u0105 znajdziecie w \u017ar\u00f3d\u0142ach.<\/p>\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8\/<\/a><\/p>\n\n<h2 id=\"2-gatsby-wraca-do-gry\" data-num=2>2. Gatsby wraca do gry<\/h2>\n\n<p>To zadziwiaj\u0105ce jak w zaledwie kilka lat Gatsby przeszed\u0142 drog\u0119 od numeru jeden w kategori renderowania React po stronie serwera, do bycia jedn\u0105 z wielu alternatyw dla Next.js. Gatsby nie sk\u0142ada jednak broni i po wydanym w zesz\u0142ym roku Gatsby 4 prezentuje teraz szereg nowych funkcjonalno\u015bci, a w\u015br\u00f3d nich zupe\u0142nie now\u0105 strategi\u0119 renderowania. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-28.jpeg\" alt=\"\" class=\"wp-image-9710\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-28.jpeg 502w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-28-300x300.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-28-150x150.jpeg 150w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/figure><\/div>\n<p>Nowa strategia nazywa si\u0119 Reactive Site Generation i umo\u017cliwia automatyczne przerenderowanie wybranych stron za ka\u017cdym razem kiedy aktualizujemy nasz CMS. Ca\u0142o\u015b\u0107 mo\u017cliwa jest dzi\u0119ki integracji z GraphQL i  jak okre\u015blaj\u0105 tw\u00f3rcy tej architektury, jest to hot reload dla produkcyjnych aplikacji.<\/p>\n\n<p>Na swoim blogu zesp\u00f3\u0142 odpowiedzialny za Gartsby przygotowa\u0142 obszern\u0105 analiz\u0119 wydajno\u015bci. W zestawieniu pod uwag\u0119 wzi\u0119to zar\u00f3wno kilka alternatywnych architektur jak i zastosowanie r\u00f3\u017cnych dost\u0119pnych na rynku narz\u0119dzi. W rankingu tym Reactive Site Generation wygl\u0105da naprawde nie\u017ale. Szkoda tylko, \u017ce wymaga ona vendor lock-in do dosy\u0107 niszowej chmury, a obs\u0142ugiwane s\u0105 tylko i wy\u0142\u0105cznie wybrane narz\u0119dzia do CMS.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"548\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-29.jpeg\" alt=\"\" class=\"wp-image-9712\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-29.jpeg 548w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-29-300x274.jpeg 300w\" sizes=\"auto, (max-width: 548px) 100vw, 548px\" \/><\/figure><\/div>\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n<p><a href=\"https:\/\/www.gatsbyjs.com\/blog\/re-introducing-gatsby-a-reactive-site-generator\/\">https:\/\/www.gatsbyjs.com\/blog\/re-introducing-gatsby-a-reactive-site-generator\/<\/a><\/p>\n\n<h2 id=\"3-wtyczki-do-chrome-ukradly-dane-1-4m-uzytkownikow\" data-num=3>3. Wtyczki do Chrome ukrad\u0142y dane 1.4M u\u017cytkownik\u00f3w<\/h2>\n\n<p>M\u00f3wi\u0142 Wam ju\u017c kto\u015b, \u017ce instalowanie przegl\u0105darkowych wtyczek to nie najlepszy pomys\u0142 je\u015bli chodzi o bezpiecze\u0144stwo? Je\u015bli nie, to ja w\u0142a\u015bnie m\u00f3wi\u0119. Podczas gdy niesamowicie du\u017co uwagi po\u015bwi\u0119ca si\u0119 blokowaniu tracker\u00f3w takich Google Analytics czy Facebook Pixel oraz bezpiecze\u0144stwu aplikacji mobilnych, tak wtyczki do przegl\u0105darek zazwyczaj przechodz\u0105 poza wszelkimi radarami. My\u015bl\u0119, \u017ce to w\u0142a\u015bnie z tego powodu do dzisiaj nie s\u0105 one przez nikogo weryfikowane i maj\u0105 zaskakuj\u0105co du\u017ce uprawnienia.<\/p>\n\n<p>O tym jak niebezpieczne s\u0105 przegl\u0105darkowe wtyczki najlepiej przekonali si\u0119 u\u017cytkownicy Netflix Party, Netflix Party 2, Screenshotting, FlipShope oraz AutoBuy. Jak donosi firma McAfee, wtyczki te by\u0142y pobrane prawie p\u00f3\u0142tora miliona razy i \u015bledzi\u0142y wszystkie storny odwiedzane przez ich u\u017cytkownik\u00f3w. Je\u015bli na serwerze do znajdowa\u0142 si\u0119 link afiliacyjny dla danej strony, to by\u0142 on przesy\u0142any z powrotem do wtyczki.Ta otwiera\u0142a adekwatny iframe lub odpowiednio modyfikowa\u0142a ciasteczka, tak aby zgarn\u0105\u0107 kilka groszy.<\/p>\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\/download-24.jpeg\" alt=\"\" class=\"wp-image-9714\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-24.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-24-300x300.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-24-150x150.jpeg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n<p>Osobi\u015bcie w\u0105tpi\u0119, \u017ceby celem w\u0142a\u015bcicieli wymienionych wtyczek by\u0142o dog\u0142\u0119bne \u015bledzenie ich u\u017cytkownik\u00f3w. Nie mo\u017cemy by\u0107 tego jednak w 100% pewni, a wtyczka chc\u0105c podj\u0105\u0107 takie dzia\u0142ania powinna jasno informowa\u0107 o nich u\u017cytkownik\u00f3w. Mocno przypomina mi to kontrowersje wok\u00f3\u0142 Brave, kt\u00f3ry przez pewien czas na kilku stronach r\u00f3wnie\u017c dok\u0142ada\u0142 linki afiliacyjne. Jak wida\u0107, internetowa spo\u0142eczno\u015b\u0107 nie lubi kiedy kto\u015b pr\u00f3buje na niej zarabia\u0107 bez jej wcze\u015bniejszej zgody.<\/p>\n\n<p>Obecnie wszystkie wymienione wcze\u015bniej wtyczki znikn\u0119\u0142y ju\u017c z chrome web store. Niestety ca\u0142y proces zaj\u0105\u0142 kilka dni, a ponadto je\u015bli zainstalowali\u015bcie jedn\u0105 z nieuczciwych wtyczek, to nadal musicie manualnie j\u0105 odinstalowa\u0107. <\/p>\n\n<p>O tym, w jak z\u0142ym stanie jest bezpiecze\u0144stwo przegl\u0105darkowych wtyczek niech po\u015bwiadczy fakt, \u017ce nieuczciwa wtyczka Screenshotting w chrome web store posiada\u0142a odznak\u0119 Featured. Aby j\u0105 uzyska\u0107 przegl\u0105darka musi zosta\u0107 manualnie przetestowana przez pracownika Google i musi spe\u0142nia\u0107 najwy\u017csze standardy je\u015bli chodzi o do\u015bwiadczenia u\u017cytkownika. Ewidentnie zawi\u00f3d\u0142 tutaj czynnik ludzki, a co gorsza, przez kilka dni od wykrycia oszustwa, Google nadal rekomendowa\u0142 Screenshotting w swoim sklepie.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-25.jpeg\" alt=\"\" class=\"wp-image-9718\" width=\"-99\" height=\"-115\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-25.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-25-257x300.jpeg 257w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n<p><a href=\"https:\/\/www.bleepingcomputer.com\/news\/security\/chrome-extensions-with-14-million-installs-steal-browsing-data\/\">https:\/\/www.bleepingcomputer.com\/news\/security\/chrome-extensions-with-14-million-installs-steal-browsing-data\/<\/a><\/p>\n\n<h2 id=\"bonus-webkit-migruje-do-githuba\" data-num=4>Bonus: WebKit migruje do GitHuba <\/h2>\n\n<p>Je\u015bli podobnie jak ja my\u015bleli\u015bcie, \u017ce wszystkie powa\u017cne projekty ju\u017c od dawna u\u017cywaj\u0105 gita, to za chwil\u0119 czeka Was brutalne rozbicie ba\u0144ki. WebKit, czyli silnik przegl\u0105darki od Apple u\u017cywanej przez co pi\u0105tego u\u017cytkownika internetu, w minionym tygodniu zosta\u0142 zmigrowany z Subversion do GitHuba.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-26.jpeg\" alt=\"\" class=\"wp-image-9716\" width=\"419\" height=\"559\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-26.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-26-225x300.jpeg 225w\" sizes=\"auto, (max-width: 419px) 100vw, 419px\" \/><\/figure><\/div>\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n<p><a href=\"https:\/\/webkit.org\/blog\/13140\/webkit-on-github\/\">https:\/\/webkit.org\/blog\/13140\/webkit-on-github\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ka\u017cde kolejne wydanie TypeScriptu by\u0142o kiedy\u015b ma\u0142ym \u015bwi\u0119tem dla ka\u017cdego zainteresowanego tematyk\u0105 oko\u0142o frontendow\u0105. W tym tygodniu doczekali\u015bmy si\u0119 TypeScript 4.8 &#8211; czy warto by\u0142o czeka\u0107? <\/p>\n","protected":false},"author":12,"featured_media":9748,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[],"class_list":["post-9738","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl"],"acf":{"estimated_reading_time":"5","feature_image_visible":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/Frontend-Weekly_PL.png","feature_image_blog":{"ID":9721,"id":9721,"title":"pexels-olya-kobruseva-5428829","filename":"pexels-olya-kobruseva-5428829-scaled.jpg","filesize":416815,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-scaled.jpg","link":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/pexels-olya-kobruseva-5428829-2\/","alt":"","author":"12","description":"","caption":"","name":"pexels-olya-kobruseva-5428829-2","status":"inherit","uploaded_to":9738,"date":"2022-09-02 14:46:16","modified":"2022-09-02 14:54:41","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":2560,"height":1709,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-150x150.jpg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-300x200.jpg","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-768x513.jpg","medium_large-width":768,"medium_large-height":513,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-1024x684.jpg","large-width":1024,"large-height":684,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-1536x1025.jpg","1536x1536-width":1536,"1536x1536-height":1025,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-2048x1367.jpg","2048x2048-width":2048,"2048x2048-height":1367,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-scaled.jpg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-scaled.jpg","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/pexels-olya-kobruseva-5428829-scaled.jpg","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":401}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce - Frontend Weekly vol. 103 - 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\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce - Frontend Weekly vol. 103 - Vived\" \/>\n<meta property=\"og:description\" content=\"Ka\u017cde kolejne wydanie TypeScriptu by\u0142o kiedy\u015b ma\u0142ym \u015bwi\u0119tem dla ka\u017cdego zainteresowanego tematyk\u0105 oko\u0142o frontendow\u0105. W tym tygodniu doczekali\u015bmy si\u0119 TypeScript 4.8 - czy warto by\u0142o czeka\u0107?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-02T14:49:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:16:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en-1024x526.png\" \/>\n<meta name=\"author\" content=\"Tomasz Borowicz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en-1024x526.png\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce &#8211; Frontend Weekly vol. 103\",\"datePublished\":\"2022-09-02T14:49:55+00:00\",\"dateModified\":\"2022-09-19T11:16:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\"},\"wordCount\":1003,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png\",\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\",\"url\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\",\"name\":\"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce - Frontend Weekly vol. 103 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png\",\"datePublished\":\"2022-09-02T14:49:55+00:00\",\"dateModified\":\"2022-09-19T11:16:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png\",\"width\":1222,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce &#8211; Frontend Weekly vol. 103\"}]},{\"@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":"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce - Frontend Weekly vol. 103 - 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\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/","og_locale":"pl_PL","og_type":"article","og_title":"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce - Frontend Weekly vol. 103 - Vived","og_description":"Ka\u017cde kolejne wydanie TypeScriptu by\u0142o kiedy\u015b ma\u0142ym \u015bwi\u0119tem dla ka\u017cdego zainteresowanego tematyk\u0105 oko\u0142o frontendow\u0105. W tym tygodniu doczekali\u015bmy si\u0119 TypeScript 4.8 - czy warto by\u0142o czeka\u0107?","og_url":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/","og_site_name":"Vived","article_published_time":"2022-09-02T14:49:55+00:00","article_modified_time":"2022-09-19T11:16:23+00:00","og_image":[{"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en-1024x526.png","type":"","width":"","height":""}],"author":"Tomasz Borowicz","twitter_card":"summary_large_image","twitter_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en-1024x526.png","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce &#8211; Frontend Weekly vol. 103","datePublished":"2022-09-02T14:49:55+00:00","dateModified":"2022-09-19T11:16:23+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/"},"wordCount":1003,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png","articleSection":["Frontend"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/","url":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/","name":"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce - Frontend Weekly vol. 103 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png","datePublished":"2022-09-02T14:49:55+00:00","dateModified":"2022-09-19T11:16:23+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-103-en.png","width":1222,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/typescript-4-8-wreszcie-trafil-w-nasze-rece-frontend-weekly-vol-103\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"TypeScript 4.8 wreszcie trafi\u0142 w nasze r\u0119ce &#8211; Frontend Weekly vol. 103"}]},{"@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.8<\/h2>\n","innerContent":["\n<h2>1. TypeScript 4.8<\/h2>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>W zamierzch\u0142ych czasach ka\u017cda kolejna premiera TypeScript wzbudza\u0142a moj\u0105 ekscytacj\u0119. Optional Chaining, Template Literal Types, Type-Only Imports, Variadic Tuple Types - to by\u0142y funkcjonalno\u015bci o kt\u00f3rych czyta\u0142em z wypiekami na twarzy i nie mog\u0142em doczeka\u0107 si\u0119, a\u017c trafi\u0105 w moje r\u0119ce.<\/p>\n","innerContent":["\n<p>W zamierzch\u0142ych czasach ka\u017cda kolejna premiera TypeScript wzbudza\u0142a moj\u0105 ekscytacj\u0119. Optional Chaining, Template Literal Types, Type-Only Imports, Variadic Tuple Types - to by\u0142y funkcjonalno\u015bci o kt\u00f3rych czyta\u0142em z wypiekami na twarzy i nie mog\u0142em doczeka\u0107 si\u0119, a\u017c trafi\u0105 w moje r\u0119ce.<\/p>\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><\/p>\n","innerContent":["\n<p><\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"align":"center","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p class=\"has-text-align-center\"><img width=\"346\" height=\"460\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_631218139ff40.jpg\"\/><\/p>\n","innerContent":["\n<p class=\"has-text-align-center\"><img width=\"346\" height=\"460\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/img_631218139ff40.jpg\"\/><\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Ostatnimi czasy sporo si\u0119 jednak zmieni\u0142o. TypeScript sta\u0142 si\u0119 dojrza\u0142y j\u0119zykiem wi\u0119c ekscytuj\u0105ce nowo\u015bci sta\u0142y si\u0119 rzadko\u015bci\u0105. Nie inaczej jest te\u017c w przypadku najnowszego TypeScript 4.8, kt\u00f3ry skupia si\u0119 na lepszej obs\u0142udze kilku przypadk\u00f3w brzegowych oraz drobnych usprawnieniach wydajno\u015bci.<\/p>\n","innerContent":["\n<p>Ostatnimi czasy sporo si\u0119 jednak zmieni\u0142o. TypeScript sta\u0142 si\u0119 dojrza\u0142y j\u0119zykiem wi\u0119c ekscytuj\u0105ce nowo\u015bci sta\u0142y si\u0119 rzadko\u015bci\u0105. Nie inaczej jest te\u017c w przypadku najnowszego TypeScript 4.8, kt\u00f3ry skupia si\u0119 na lepszej obs\u0142udze kilku przypadk\u00f3w brzegowych oraz drobnych usprawnieniach wydajno\u015bci.<\/p>\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9704,"width":464,"height":311,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-22.jpeg\" alt=\"\" class=\"wp-image-9704\" width=\"464\" height=\"311\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-22.jpeg\" alt=\"\" class=\"wp-image-9704\" width=\"464\" height=\"311\"\/><\/figure>"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Z dziennikarskiego obowi\u0105zku przytocz\u0119 Wam tutaj kilka najciekawszych moim zdaniem zmian. Je\u015bli jednak macie troch\u0119 wi\u0119cej czasu, to jak zwykle polecam zanurzy\u0107 si\u0119 w d\u0142ug\u0105 i dog\u0142\u0119bn\u0105 notatk\u0119, kt\u00f3r\u0105 przygotowa\u0142 Microsoft.<\/p>\n","innerContent":["\n<p>Z dziennikarskiego obowi\u0105zku przytocz\u0119 Wam tutaj kilka najciekawszych moim zdaniem zmian. Je\u015bli jednak macie troch\u0119 wi\u0119cej czasu, to jak zwykle polecam zanurzy\u0107 si\u0119 w d\u0142ug\u0105 i dog\u0142\u0119bn\u0105 notatk\u0119, kt\u00f3r\u0105 przygotowa\u0142 Microsoft.<\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Zacznijmy od usprawnie\u0144 Intersection Reduction oraz Union Compatibility. Pod t\u0105 skomplikowan\u0105 nazw\u0105 kryj\u0105 si\u0119 tak naprawd\u0119 dwie proste zmiany. Pierwsza z nich polega na uto\u017csamieniu typu unknown z uni\u0105 pustego obiektu, null i undefined.<\/p>\n","innerContent":["\n<p>Zacznijmy od usprawnie\u0144 Intersection Reduction oraz Union Compatibility. Pod t\u0105 skomplikowan\u0105 nazw\u0105 kryj\u0105 si\u0119 tak naprawd\u0119 dwie proste zmiany. Pierwsza z nich polega na uto\u017csamieniu typu unknown z uni\u0105 pustego obiektu, null i undefined.<\/p>\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">function f(x: unknown, y: {} | null | undefined) {\r\n    x = y; \/\/ always worked\r\n    y = x; \/\/ used to error, now works\r\n}<\/code><\/pre>\r\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">function f(x: unknown, y: {} | null | undefined) {\r\n    x = y; \/\/ always worked\r\n    y = x; \/\/ used to error, now works\r\n}<\/code><\/pre>\r\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Druga zmiana polega na tym, \u017ce od teraz cz\u0119\u015b\u0107 wsp\u00f3lna mi\u0119dzy dowolnym typem obiektu i pustym obiektem b\u0119dzie rozwijana po prostu jako ten obiekt. Zmiana ta pozwoli\u0142a zredefiniowa\u0107 typ NonNullable. W po\u0142\u0105czeniu ze zmian\u0105 z poprzedniego akapitu pozwala to na kilku naprawd\u0119 zgrabnych usprawnie\u0144 w kodzie.<\/p>\n","innerContent":["\n<p>Druga zmiana polega na tym, \u017ce od teraz cz\u0119\u015b\u0107 wsp\u00f3lna mi\u0119dzy dowolnym typem obiektu i pustym obiektem b\u0119dzie rozwijana po prostu jako ten obiekt. Zmiana ta pozwoli\u0142a zredefiniowa\u0107 typ NonNullable. W po\u0142\u0105czeniu ze zmian\u0105 z poprzedniego akapitu pozwala to na kilku naprawd\u0119 zgrabnych usprawnie\u0144 w kodzie.<\/p>\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type NonNullable&lt;T> = T &amp; {};\r\n\r\nfunction throwIfNullable&lt;T>(value: T): NonNullable&lt;T> {\r\n    if (value === undefined || value === null) {\r\n        throw Error(\"Nullable value!\");\r\n    }\r\n\r\n    \/\/ Used to fail because 'T' was not assignable to 'NonNullable&lt;T>'.\r\n    \/\/ Now narrows to 'T &amp; {}' and succeeds because that's just 'NonNullable&lt;T>'.\r\n    return value;\r\n}<\/code><\/pre>\r\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">type NonNullable&lt;T> = T &amp; {};\r\n\r\nfunction throwIfNullable&lt;T>(value: T): NonNullable&lt;T> {\r\n    if (value === undefined || value === null) {\r\n        throw Error(\"Nullable value!\");\r\n    }\r\n\r\n    \/\/ Used to fail because 'T' was not assignable to 'NonNullable&lt;T>'.\r\n    \/\/ Now narrows to 'T &amp; {}' and succeeds because that's just 'NonNullable&lt;T>'.\r\n    return value;\r\n}<\/code><\/pre>\r\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Na koniec zostawi\u0142em sobie nowo\u015b\u0107, kt\u00f3ra w pierwszej chwili sprawi\u0142a, \u017ce m\u00f3j m\u00f3zg zacz\u0105\u0142 lekko parowa\u0107. W du\u017cym uproszczeniu s\u0142owo kluczowe infer pozwala nam wyekstraktowa\u0107 kawa\u0142ek typu, tak aby wykorzysta\u0107 go p\u00f3\u017aniej, np. w Conditional Type. Od teraz b\u0119dzie mo\u017cna go wykorzystywa\u0107 r\u00f3wnie\u017c w Template String Type. Brzmi skomplikowanie i tak te\u017c wygl\u0105da.<\/p>\n","innerContent":["\n<p>Na koniec zostawi\u0142em sobie nowo\u015b\u0107, kt\u00f3ra w pierwszej chwili sprawi\u0142a, \u017ce m\u00f3j m\u00f3zg zacz\u0105\u0142 lekko parowa\u0107. W du\u017cym uproszczeniu s\u0142owo kluczowe infer pozwala nam wyekstraktowa\u0107 kawa\u0142ek typu, tak aby wykorzysta\u0107 go p\u00f3\u017aniej, np. w Conditional Type. Od teraz b\u0119dzie mo\u017cna go wykorzystywa\u0107 r\u00f3wnie\u017c w Template String Type. Brzmi skomplikowanie i tak te\u017c wygl\u0105da.<\/p>\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ SomeNum used to be 'number'; now it's '100'.\r\ntype SomeNum = \"100\" extends `${infer U extends number}` ? U : never;\r\n\r\n\/\/ SomeBigInt used to be 'bigint'; now it's '100n'.\r\ntype SomeBigInt = \"100\" extends `${infer U extends bigint}` ? U : never;\r\n\r\n\/\/ SomeBool used to be 'boolean'; now it's 'true'.\r\ntype SomeBool = \"true\" extends `${infer U extends boolean}` ? U : never;<\/code><\/pre>\r\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ SomeNum used to be 'number'; now it's '100'.\r\ntype SomeNum = \"100\" extends `${infer U extends number}` ? U : never;\r\n\r\n\/\/ SomeBigInt used to be 'bigint'; now it's '100n'.\r\ntype SomeBigInt = \"100\" extends `${infer U extends bigint}` ? U : never;\r\n\r\n\/\/ SomeBool used to be 'boolean'; now it's 'true'.\r\ntype SomeBool = \"true\" extends `${infer U extends boolean}` ? U : never;<\/code><\/pre>\r\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9706,"width":553,"height":368,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-23.jpeg\" alt=\"\" class=\"wp-image-9706\" width=\"553\" height=\"368\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-23.jpeg\" alt=\"\" class=\"wp-image-9706\" width=\"553\" height=\"368\"\/><\/figure>"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz opisanych przeze mnie nowo\u015bci, Microsoft przygotowa\u0142 te\u017c szereg bufix\u00f3w i usprawnie\u0144 wydajno\u015bci. Tak jak wspomina\u0142em, je\u015bli jeste\u015bcie zainteresowani szczeg\u00f3\u0142ami, to najlepiej zrobicie je\u015bli natychmiast przejdziecie do notatki towarzysz\u0105cej wydaniu, kt\u00f3r\u0105 znajdziecie w \u017ar\u00f3d\u0142ach.<\/p>\n","innerContent":["\n<p>Opr\u00f3cz opisanych przeze mnie nowo\u015bci, Microsoft przygotowa\u0142 te\u017c szereg bufix\u00f3w i usprawnie\u0144 wydajno\u015bci. Tak jak wspomina\u0142em, je\u015bli jeste\u015bcie zainteresowani szczeg\u00f3\u0142ami, to najlepiej zrobicie je\u015bli natychmiast przejdziecie do notatki towarzysz\u0105cej wydaniu, kt\u00f3r\u0105 znajdziecie w \u017ar\u00f3d\u0142ach.<\/p>\n"]},{"blockName":"core\/heading","attrs":{"level":3,"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-8\/<\/a><\/p>\n"]},{"blockName":"core\/heading","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h2>2. Gatsby wraca do gry<\/h2>\n","innerContent":["\n<h2>2. Gatsby wraca do gry<\/h2>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>To zadziwiaj\u0105ce jak w zaledwie kilka lat Gatsby przeszed\u0142 drog\u0119 od numeru jeden w kategori renderowania React po stronie serwera, do bycia jedn\u0105 z wielu alternatyw dla Next.js. Gatsby nie sk\u0142ada jednak broni i po wydanym w zesz\u0142ym roku Gatsby 4 prezentuje teraz szereg nowych funkcjonalno\u015bci, a w\u015br\u00f3d nich zupe\u0142nie now\u0105 strategi\u0119 renderowania. <\/p>\n","innerContent":["\n<p>To zadziwiaj\u0105ce jak w zaledwie kilka lat Gatsby przeszed\u0142 drog\u0119 od numeru jeden w kategori renderowania React po stronie serwera, do bycia jedn\u0105 z wielu alternatyw dla Next.js. Gatsby nie sk\u0142ada jednak broni i po wydanym w zesz\u0142ym roku Gatsby 4 prezentuje teraz szereg nowych funkcjonalno\u015bci, a w\u015br\u00f3d nich zupe\u0142nie now\u0105 strategi\u0119 renderowania. <\/p>\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9710,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-28.jpeg\" alt=\"\" class=\"wp-image-9710\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-28.jpeg\" alt=\"\" class=\"wp-image-9710\"\/><\/figure>"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Nowa strategia nazywa si\u0119 Reactive Site Generation i umo\u017cliwia automatyczne przerenderowanie wybranych stron za ka\u017cdym razem kiedy aktualizujemy nasz CMS. Ca\u0142o\u015b\u0107 mo\u017cliwa jest dzi\u0119ki integracji z GraphQL i  jak okre\u015blaj\u0105 tw\u00f3rcy tej architektury, jest to hot reload dla produkcyjnych aplikacji.<\/p>\n","innerContent":["\n<p>Nowa strategia nazywa si\u0119 Reactive Site Generation i umo\u017cliwia automatyczne przerenderowanie wybranych stron za ka\u017cdym razem kiedy aktualizujemy nasz CMS. Ca\u0142o\u015b\u0107 mo\u017cliwa jest dzi\u0119ki integracji z GraphQL i  jak okre\u015blaj\u0105 tw\u00f3rcy tej architektury, jest to hot reload dla produkcyjnych aplikacji.<\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Na swoim blogu zesp\u00f3\u0142 odpowiedzialny za Gartsby przygotowa\u0142 obszern\u0105 analiz\u0119 wydajno\u015bci. W zestawieniu pod uwag\u0119 wzi\u0119to zar\u00f3wno kilka alternatywnych architektur jak i zastosowanie r\u00f3\u017cnych dost\u0119pnych na rynku narz\u0119dzi. W rankingu tym Reactive Site Generation wygl\u0105da naprawde nie\u017ale. Szkoda tylko, \u017ce wymaga ona vendor lock-in do dosy\u0107 niszowej chmury, a obs\u0142ugiwane s\u0105 tylko i wy\u0142\u0105cznie wybrane narz\u0119dzia do CMS.<\/p>\n","innerContent":["\n<p>Na swoim blogu zesp\u00f3\u0142 odpowiedzialny za Gartsby przygotowa\u0142 obszern\u0105 analiz\u0119 wydajno\u015bci. W zestawieniu pod uwag\u0119 wzi\u0119to zar\u00f3wno kilka alternatywnych architektur jak i zastosowanie r\u00f3\u017cnych dost\u0119pnych na rynku narz\u0119dzi. W rankingu tym Reactive Site Generation wygl\u0105da naprawde nie\u017ale. Szkoda tylko, \u017ce wymaga ona vendor lock-in do dosy\u0107 niszowej chmury, a obs\u0142ugiwane s\u0105 tylko i wy\u0142\u0105cznie wybrane narz\u0119dzia do CMS.<\/p>\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9712,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-29.jpeg\" alt=\"\" class=\"wp-image-9712\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-29.jpeg\" alt=\"\" class=\"wp-image-9712\"\/><\/figure>"]},{"blockName":"core\/heading","attrs":{"level":3,"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/www.gatsbyjs.com\/blog\/re-introducing-gatsby-a-reactive-site-generator\/\">https:\/\/www.gatsbyjs.com\/blog\/re-introducing-gatsby-a-reactive-site-generator\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/www.gatsbyjs.com\/blog\/re-introducing-gatsby-a-reactive-site-generator\/\">https:\/\/www.gatsbyjs.com\/blog\/re-introducing-gatsby-a-reactive-site-generator\/<\/a><\/p>\n"]},{"blockName":"core\/heading","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h2>3. Wtyczki do Chrome ukrad\u0142y dane 1.4M u\u017cytkownik\u00f3w<\/h2>\n","innerContent":["\n<h2>3. Wtyczki do Chrome ukrad\u0142y dane 1.4M u\u017cytkownik\u00f3w<\/h2>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>M\u00f3wi\u0142 Wam ju\u017c kto\u015b, \u017ce instalowanie przegl\u0105darkowych wtyczek to nie najlepszy pomys\u0142 je\u015bli chodzi o bezpiecze\u0144stwo? Je\u015bli nie, to ja w\u0142a\u015bnie m\u00f3wi\u0119. Podczas gdy niesamowicie du\u017co uwagi po\u015bwi\u0119ca si\u0119 blokowaniu tracker\u00f3w takich Google Analytics czy Facebook Pixel oraz bezpiecze\u0144stwu aplikacji mobilnych, tak wtyczki do przegl\u0105darek zazwyczaj przechodz\u0105 poza wszelkimi radarami. My\u015bl\u0119, \u017ce to w\u0142a\u015bnie z tego powodu do dzisiaj nie s\u0105 one przez nikogo weryfikowane i maj\u0105 zaskakuj\u0105co du\u017ce uprawnienia.<\/p>\n","innerContent":["\n<p>M\u00f3wi\u0142 Wam ju\u017c kto\u015b, \u017ce instalowanie przegl\u0105darkowych wtyczek to nie najlepszy pomys\u0142 je\u015bli chodzi o bezpiecze\u0144stwo? Je\u015bli nie, to ja w\u0142a\u015bnie m\u00f3wi\u0119. Podczas gdy niesamowicie du\u017co uwagi po\u015bwi\u0119ca si\u0119 blokowaniu tracker\u00f3w takich Google Analytics czy Facebook Pixel oraz bezpiecze\u0144stwu aplikacji mobilnych, tak wtyczki do przegl\u0105darek zazwyczaj przechodz\u0105 poza wszelkimi radarami. My\u015bl\u0119, \u017ce to w\u0142a\u015bnie z tego powodu do dzisiaj nie s\u0105 one przez nikogo weryfikowane i maj\u0105 zaskakuj\u0105co du\u017ce uprawnienia.<\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>O tym jak niebezpieczne s\u0105 przegl\u0105darkowe wtyczki najlepiej przekonali si\u0119 u\u017cytkownicy Netflix Party, Netflix Party 2, Screenshotting, FlipShope oraz AutoBuy. Jak donosi firma McAfee, wtyczki te by\u0142y pobrane prawie p\u00f3\u0142tora miliona razy i \u015bledzi\u0142y wszystkie storny odwiedzane przez ich u\u017cytkownik\u00f3w. Je\u015bli na serwerze do znajdowa\u0142 si\u0119 link afiliacyjny dla danej strony, to by\u0142 on przesy\u0142any z powrotem do wtyczki.Ta otwiera\u0142a adekwatny iframe lub odpowiednio modyfikowa\u0142a ciasteczka, tak aby zgarn\u0105\u0107 kilka groszy.<\/p>\n","innerContent":["\n<p>O tym jak niebezpieczne s\u0105 przegl\u0105darkowe wtyczki najlepiej przekonali si\u0119 u\u017cytkownicy Netflix Party, Netflix Party 2, Screenshotting, FlipShope oraz AutoBuy. Jak donosi firma McAfee, wtyczki te by\u0142y pobrane prawie p\u00f3\u0142tora miliona razy i \u015bledzi\u0142y wszystkie storny odwiedzane przez ich u\u017cytkownik\u00f3w. Je\u015bli na serwerze do znajdowa\u0142 si\u0119 link afiliacyjny dla danej strony, to by\u0142 on przesy\u0142any z powrotem do wtyczki.Ta otwiera\u0142a adekwatny iframe lub odpowiednio modyfikowa\u0142a ciasteczka, tak aby zgarn\u0105\u0107 kilka groszy.<\/p>\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9714,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-24.jpeg\" alt=\"\" class=\"wp-image-9714\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-24.jpeg\" alt=\"\" class=\"wp-image-9714\"\/><\/figure>"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Osobi\u015bcie w\u0105tpi\u0119, \u017ceby celem w\u0142a\u015bcicieli wymienionych wtyczek by\u0142o dog\u0142\u0119bne \u015bledzenie ich u\u017cytkownik\u00f3w. Nie mo\u017cemy by\u0107 tego jednak w 100% pewni, a wtyczka chc\u0105c podj\u0105\u0107 takie dzia\u0142ania powinna jasno informowa\u0107 o nich u\u017cytkownik\u00f3w. Mocno przypomina mi to kontrowersje wok\u00f3\u0142 Brave, kt\u00f3ry przez pewien czas na kilku stronach r\u00f3wnie\u017c dok\u0142ada\u0142 linki afiliacyjne. Jak wida\u0107, internetowa spo\u0142eczno\u015b\u0107 nie lubi kiedy kto\u015b pr\u00f3buje na niej zarabia\u0107 bez jej wcze\u015bniejszej zgody.<\/p>\n","innerContent":["\n<p>Osobi\u015bcie w\u0105tpi\u0119, \u017ceby celem w\u0142a\u015bcicieli wymienionych wtyczek by\u0142o dog\u0142\u0119bne \u015bledzenie ich u\u017cytkownik\u00f3w. Nie mo\u017cemy by\u0107 tego jednak w 100% pewni, a wtyczka chc\u0105c podj\u0105\u0107 takie dzia\u0142ania powinna jasno informowa\u0107 o nich u\u017cytkownik\u00f3w. Mocno przypomina mi to kontrowersje wok\u00f3\u0142 Brave, kt\u00f3ry przez pewien czas na kilku stronach r\u00f3wnie\u017c dok\u0142ada\u0142 linki afiliacyjne. Jak wida\u0107, internetowa spo\u0142eczno\u015b\u0107 nie lubi kiedy kto\u015b pr\u00f3buje na niej zarabia\u0107 bez jej wcze\u015bniejszej zgody.<\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Obecnie wszystkie wymienione wcze\u015bniej wtyczki znikn\u0119\u0142y ju\u017c z chrome web store. Niestety ca\u0142y proces zaj\u0105\u0142 kilka dni, a ponadto je\u015bli zainstalowali\u015bcie jedn\u0105 z nieuczciwych wtyczek, to nadal musicie manualnie j\u0105 odinstalowa\u0107. <\/p>\n","innerContent":["\n<p>Obecnie wszystkie wymienione wcze\u015bniej wtyczki znikn\u0119\u0142y ju\u017c z chrome web store. Niestety ca\u0142y proces zaj\u0105\u0142 kilka dni, a ponadto je\u015bli zainstalowali\u015bcie jedn\u0105 z nieuczciwych wtyczek, to nadal musicie manualnie j\u0105 odinstalowa\u0107. <\/p>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>O tym, w jak z\u0142ym stanie jest bezpiecze\u0144stwo przegl\u0105darkowych wtyczek niech po\u015bwiadczy fakt, \u017ce nieuczciwa wtyczka Screenshotting w chrome web store posiada\u0142a odznak\u0119 Featured. Aby j\u0105 uzyska\u0107 przegl\u0105darka musi zosta\u0107 manualnie przetestowana przez pracownika Google i musi spe\u0142nia\u0107 najwy\u017csze standardy je\u015bli chodzi o do\u015bwiadczenia u\u017cytkownika. Ewidentnie zawi\u00f3d\u0142 tutaj czynnik ludzki, a co gorsza, przez kilka dni od wykrycia oszustwa, Google nadal rekomendowa\u0142 Screenshotting w swoim sklepie.<\/p>\n","innerContent":["\n<p>O tym, w jak z\u0142ym stanie jest bezpiecze\u0144stwo przegl\u0105darkowych wtyczek niech po\u015bwiadczy fakt, \u017ce nieuczciwa wtyczka Screenshotting w chrome web store posiada\u0142a odznak\u0119 Featured. Aby j\u0105 uzyska\u0107 przegl\u0105darka musi zosta\u0107 manualnie przetestowana przez pracownika Google i musi spe\u0142nia\u0107 najwy\u017csze standardy je\u015bli chodzi o do\u015bwiadczenia u\u017cytkownika. Ewidentnie zawi\u00f3d\u0142 tutaj czynnik ludzki, a co gorsza, przez kilka dni od wykrycia oszustwa, Google nadal rekomendowa\u0142 Screenshotting w swoim sklepie.<\/p>\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9718,"width":-99,"height":-115,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-25.jpeg\" alt=\"\" class=\"wp-image-9718\" width=\"-99\" height=\"-115\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-25.jpeg\" alt=\"\" class=\"wp-image-9718\" width=\"-99\" height=\"-115\"\/><\/figure>"]},{"blockName":"core\/heading","attrs":{"level":3,"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/www.bleepingcomputer.com\/news\/security\/chrome-extensions-with-14-million-installs-steal-browsing-data\/\">https:\/\/www.bleepingcomputer.com\/news\/security\/chrome-extensions-with-14-million-installs-steal-browsing-data\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/www.bleepingcomputer.com\/news\/security\/chrome-extensions-with-14-million-installs-steal-browsing-data\/\">https:\/\/www.bleepingcomputer.com\/news\/security\/chrome-extensions-with-14-million-installs-steal-browsing-data\/<\/a><\/p>\n"]},{"blockName":"core\/heading","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h2>Bonus: WebKit migruje do GitHuba <\/h2>\n","innerContent":["\n<h2>Bonus: WebKit migruje do GitHuba <\/h2>\n"]},{"blockName":"core\/paragraph","attrs":{"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli podobnie jak ja my\u015bleli\u015bcie, \u017ce wszystkie powa\u017cne projekty ju\u017c od dawna u\u017cywaj\u0105 gita, to za chwil\u0119 czeka Was brutalne rozbicie ba\u0144ki. WebKit, czyli silnik przegl\u0105darki od Apple u\u017cywanej przez co pi\u0105tego u\u017cytkownika internetu, w minionym tygodniu zosta\u0142 zmigrowany z Subversion do GitHuba.<\/p>\n","innerContent":["\n<p>Je\u015bli podobnie jak ja my\u015bleli\u015bcie, \u017ce wszystkie powa\u017cne projekty ju\u017c od dawna u\u017cywaj\u0105 gita, to za chwil\u0119 czeka Was brutalne rozbicie ba\u0144ki. WebKit, czyli silnik przegl\u0105darki od Apple u\u017cywanej przez co pi\u0105tego u\u017cytkownika internetu, w minionym tygodniu zosta\u0142 zmigrowany z Subversion do GitHuba.<\/p>\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":9716,"width":419,"height":559,"sizeSlug":"full","linkDestination":"none","translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-26.jpeg\" alt=\"\" class=\"wp-image-9716\" width=\"419\" height=\"559\"\/><\/figure>","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/download-26.jpeg\" alt=\"\" class=\"wp-image-9716\" width=\"419\" height=\"559\"\/><\/figure>"]},{"blockName":"core\/heading","attrs":{"level":3,"translatedWithWPMLTM":"1"},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/webkit.org\/blog\/13140\/webkit-on-github\/\">https:\/\/webkit.org\/blog\/13140\/webkit-on-github\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/webkit.org\/blog\/13140\/webkit-on-github\/\">https:\/\/webkit.org\/blog\/13140\/webkit-on-github\/<\/a><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9738","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=9738"}],"version-history":[{"count":6,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9738\/revisions"}],"predecessor-version":[{"id":9851,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9738\/revisions\/9851"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/9748"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=9738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=9738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=9738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}