{"id":10071,"date":"2021-10-07T16:49:54","date_gmt":"2021-10-07T14:49:54","guid":{"rendered":"https:\/\/vived.io\/frontend-thursday-vol-58\/"},"modified":"2022-09-19T13:16:37","modified_gmt":"2022-09-19T11:16:37","slug":"frontend-thursday-vol-58","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/","title":{"rendered":"Frontend Thursday vol. 58"},"content":{"rendered":"\n<h2 id=\"1-typescript-4-5-beta\" data-num=1>1. TypeScript 4.5 Beta<\/h2>\n\n\n\n<p>Zawsze powtarzam, \u017ce kolejne wydania TypeScript s\u0105 dla mnie ma\u0142ymi \u015bwi\u0119tami. Kolejne takie wydarzenie zbli\u017ca si\u0119 wielkimi krokami, bo kilka dni temu ukaza\u0142a si\u0119 beta wersji 4.5 tego j\u0119zyk (co oznacza, \u017ce pe\u0142ne wydanie ujrzymy za mniej\/wi\u0119cej dwa miesi\u0105ce). Tak jak w przypadku kilku ostatnich wersji mamy tu do czynienia raczej z ewolucj\u0105, a nie rewolucj\u0105, ale wci\u0105\u017c warto zapozna\u0107 si\u0119 z nowo\u015bciami.<\/p>\n\n\n\n<p>Najwi\u0119ksze nadchodz\u0105ce zmiany dotycz\u0105 modu\u0142\u00f3w w Node.js. Do compilerOptions dodane zosta\u0142y dwa nowe wspierane rodzaje wspieranych modu\u0142\u00f3w: \u2018node12\u2019 i \u2018nodenext\u2019. Nowe opcje pozwol\u0105 emitowa\u0107 pliki JavaScript wspieraj\u0105ce ECMAScript Modules (te s\u0105 wspierane w\u0142a\u015bnie od Node.js 12). Nowy TypeScript b\u0119dzie uwzgl\u0119dnia\u0142 r\u00f3wnie\u017c pole type w package.json, aby w odpowiedni spos\u00f3b importowa\u0107 pliki .ts i .tsx. To jeszcze nie koniec, bo Typescript dostanie swoje odpowiedniki plik\u00f3w o rozszerzeniu .mjs (.mts) i .cjs (.cts).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/giphy.gif\" alt=\"\" class=\"wp-image-2768\" width=\"587\" height=\"419\"\/><figcaption>Modu\u0142y w Node.js wci\u0105\u017c potrafi\u0105 przyprawi\u0107 o zawr\u00f3t g\u0142owy, ale programi\u015bci Node.js na pewno doceni\u0105 nadchodz\u0105ce usprawnienia.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Na szcz\u0119\u015bcie nie samym Node.js cz\u0142owiek \u017cyje i do TypeScript zmierza te\u017c kilka nowo\u015bci, kt\u00f3re zainteresuj\u0105 tych zajmuj\u0105cych si\u0119 g\u0142\u00f3wnie kodem uruchamianym w przegl\u0105darkach. W nadchodz\u0105cej wersji j\u0119zyka od Microsoftu znajdziemy nowy utility type Awaited. Jego zadaniem jest sp\u0142aszczenie wszystkich struktur opartych o Promise i PromiseLike. Je\u015bli na co dzie\u0144 nie modelujecie skomplikowanych struktur danych to r\u00f3wnie\u017c na nim skorzystacie, bo Promise.all, Promise.race b\u0119d\u0105 wykorzystywa\u0107 go w swoich deklaracjach.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ A = string\ntype A = Awaited&lt;Promise&lt;string&gt;&gt;;\n\n\/\/ B = number\ntype B = Awaited&lt;Promise&lt;Promise&lt;number&gt;&gt;&gt;;\n\n\/\/ C = boolean | number\ntype C = Awaited&lt;boolean | Promise&lt;number&gt;&gt;;\n\ndeclare function MaybePromise&lt;T&gt;(value: T): T | Promise&lt;T&gt; | PromiseLike&lt;T&gt;;\n\nasync function doSomething(): Promise&lt;[number, number]&gt; {\n    const result = await Promise.all([\n        MaybePromise(100),\n        MaybePromise(200)\n    ]);\n\n    \/\/ in Typescript 4.4 this caused following error:\n    \/\/    [number | Promise&lt;100&gt;, number | Promise&lt;200&gt;]\n    \/\/\n    \/\/ is not assignable to type\n    \/\/\n    \/\/    [number, number]\n    return result;\n}<\/code><\/pre>\n\n\n\n<p>Do TypeScript 4.5 wersji zmierza te\u017c wsparcie dla dw\u00f3ch ECMAScript proposals. Pierwszy z nich to sprawdzanie obecno\u015bci prywatnych p\u00f3l w klasach, a drugi to import assertions pozwalaj\u0105cy na import obiektu z pliku json.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">class Person {\n    #name: string;\n    constructor(name: string) {\n        this.#name = name;\n    }\n\n    equals(other: unknown) {\n        return other &amp;&amp;\n            typeof other === &quot;object&quot; &amp;&amp;\n            #name in other &amp;&amp; \/\/ &lt;- this is new!\n            this.#name === other.#name;\n    }\n}\n\nimport obj from &quot;.\/something.json&quot; assert { type: &quot;json&quot; };<\/code><\/pre>\n\n\n\n<p>Oczywi\u015bcie to tylko kilka z nadchodz\u0105cych zmian. Je\u015bli jeste\u015bcie ciekawi co jeszcze trafi do nowego TypeScriptu to zapraszamy do \u015bwietnie przygotowanej przez Microsoft notatki, kt\u00f3r\u0105 znajdziecie w \u017ar\u00f3d\u0142ach. My natomiast przyjrzymy si\u0119 im dok\u0142adnie kiedy kurz opadnie i wydana zostanie ostateczna wersja j\u0119zyka.<\/p>\n\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-5-beta\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-5-beta\/<\/a><\/p>\n\n\n\n<h2 id=\"2-react-native-0-66\" data-num=2>2. React Native 0.66<\/h2>\n\n\n\n<p>W minionym tygodniu, zgodnie z planem releasowym, powitali\u015bmy kolejn\u0105 wersj\u0119 React Native. W nowym wydaniu znalaz\u0142o si\u0119:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Wsparcie dla klikni\u0119\u0107 w widoki wyrenderowane poza rodzicem<\/li><li>Wsparcie dla nowych pozwole\u0144 na dost\u0119p do Bluetoth na Androidzie<\/li><li>Usprawnione wsparcie dla Apple Silicon, Xcode 13 i iOS15<\/li><li>Nowa wersja Hermes (0.9.0)<\/li><\/ul>\n\n\n\n<p>Nie znajdziemy tutaj nic wstrz\u0105saj\u0105co ciekawego, ale co\u015b podpowiada mi, \u017ce wielu z Was zainteresuj\u0105 te zmiany.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/reactnative.dev\/blog\/2021\/10\/01\/version-066\">https:\/\/reactnative.dev\/blog\/2021\/10\/01\/version-066<\/a><\/p>\n\n\n\n<h2 id=\"3-nowa-biblioteka-do-zarzadzania-stanem-elf\" data-num=3>3. Nowa biblioteka do zarz\u0105dzania stanem: Elf<\/h2>\n\n\n\n<p>Kojarzycie bibliotek\u0119 do zarz\u0105dzania stanem aplikacji Akita? Je\u015bli tak, to zapewne zdziwi Was fakt, \u017ce jej tw\u00f3rca w zesz\u0142ym tygodniu opublikowa\u0142 now\u0105 bibliotek\u0119 do zarz\u0105dzania stanem aplikacji Elf. Przygl\u0105daj\u0105c si\u0119 dokumentacji obydwu rozwi\u0105za\u0144 trudno nie dostrzec mi\u0119dzy nimi podobie\u0144stw. Jak twierdzi Netanel Basal Akita nie jest zagro\u017cona i nadal b\u0119dzie rozwijana, a nowa biblioteka ma by\u0107 rozwijana bardziej w kierunku wyznaczonym przez spo\u0142eczno\u015b\u0107 ni\u017c Datoram\u0119 (komercyjnego sponsora biblioteki). Jedno trzeba przyzna\u0107: Elf od pocz\u0105tku przygotowywany jest z my\u015bl\u0105 o wielu frameworkach i powinien sprawdza\u0107 si\u0119 nie tylko w Angularze.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { Store, createState, withProps, select } from &#039;@ngneat\/elf&#039;;\nimport { withEntities, selectAll, setEntities } from &#039;@ngneat\/elf-entities&#039;;\n\ninterface TodosProps {\n  filter: &#039;ALL&#039; | &#039;ACTIVE&#039; | &#039;COMPLETED&#039;;\n}\n\ninterface Todo {\n  id: string;\n  title: string;\n  status: string;\n}\n\nconst { state, config } = createState(\n  withProps&lt;TodosProps&gt;({ filter: &#039;ALL&#039; }),\n  withEntities&lt;Todo&gt;()\n);\n\nconst store = new Store({ name: &#039;todos&#039;, state, config });\n\nexport const filter$ = store.pipe(select(({ filter }) =&gt; filter));\nexport const todos$ = store.pipe(selectAll());\n\nexport function setTodos(todos: Todo[]) {\n  store.reduce(setEntities(todos));\n}\n\nexport function updateFilter(filter: TodosProps[&#039;filter&#039;]) {\n  store.reduce(state =&gt; ({\n    ...state,\n    filter\n  }));\n}<\/code><\/pre>\n\n\n\n<p>A Wy co o tym my\u015blicie? Czy spo\u0142eczno\u015b\u0107 naprawd\u0119 potrzebuje kolejnej biblioteki do zarz\u0105dzania stanem?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/ngneat\/elf\">https:\/\/github.com\/ngneat\/elf<\/a><br><a href=\"https:\/\/ngneat.github.io\/elf\/\">https:\/\/ngneat.github.io\/elf\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym tygodniu mamy dla Was bet\u0119  TypeScript 4.5, nowego React Native i bibliotek\u0119 do zarz\u0105dzania stanem aplikacji od tw\u00f3rc\u00f3w Akity.<\/p>\n","protected":false},"author":12,"featured_media":7724,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[],"class_list":["post-10071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl"],"acf":{"estimated_reading_time":"3","weekly_summary":true},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Frontend Thursday vol. 58 - 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\/frontend-thursday-vol-58\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Frontend Thursday vol. 58 - Vived\" \/>\n<meta property=\"og:description\" content=\"W tym tygodniu mamy dla Was bet\u0119 TypeScript 4.5, nowego React Native i bibliotek\u0119 do zarz\u0105dzania stanem aplikacji od tw\u00f3rc\u00f3w Akity.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-07T14:49:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:16:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1002\" \/>\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\/frontend-thursday-vol-58\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Frontend Thursday vol. 58\",\"datePublished\":\"2021-10-07T14:49:54+00:00\",\"dateModified\":\"2022-09-19T11:16:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/\"},\"wordCount\":591,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png\",\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/\",\"url\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/\",\"name\":\"Frontend Thursday vol. 58 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png\",\"datePublished\":\"2021-10-07T14:49:54+00:00\",\"dateModified\":\"2022-09-19T11:16:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png\",\"width\":1920,\"height\":1002},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frontend Thursday vol. 58\"}]},{\"@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":"Frontend Thursday vol. 58 - 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\/frontend-thursday-vol-58\/","og_locale":"pl_PL","og_type":"article","og_title":"Frontend Thursday vol. 58 - Vived","og_description":"W tym tygodniu mamy dla Was bet\u0119 TypeScript 4.5, nowego React Native i bibliotek\u0119 do zarz\u0105dzania stanem aplikacji od tw\u00f3rc\u00f3w Akity.","og_url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/","og_site_name":"Vived","article_published_time":"2021-10-07T14:49:54+00:00","article_modified_time":"2022-09-19T11:16:37+00:00","og_image":[{"width":1920,"height":1002,"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.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\/frontend-thursday-vol-58\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Frontend Thursday vol. 58","datePublished":"2021-10-07T14:49:54+00:00","dateModified":"2022-09-19T11:16:37+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/"},"wordCount":591,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png","articleSection":["Frontend"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/","url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/","name":"Frontend Thursday vol. 58 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png","datePublished":"2021-10-07T14:49:54+00:00","dateModified":"2022-09-19T11:16:37+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-07-at-16.46.27.png","width":1920,"height":1002},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-58\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Frontend Thursday vol. 58"}]},{"@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.5 Beta<\/h2>\n","innerContent":["\n<h2>1. TypeScript 4.5 Beta<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zawsze powtarzam, \u017ce kolejne wydania TypeScript s\u0105 dla mnie ma\u0142ymi \u015bwi\u0119tami. Kolejne takie wydarzenie zbli\u017ca si\u0119 wielkimi krokami, bo kilka dni temu ukaza\u0142a si\u0119 beta wersji 4.5 tego j\u0119zyk (co oznacza, \u017ce pe\u0142ne wydanie ujrzymy za mniej\/wi\u0119cej dwa miesi\u0105ce). Tak jak w przypadku kilku ostatnich wersji mamy tu do czynienia raczej z ewolucj\u0105, a nie rewolucj\u0105, ale wci\u0105\u017c warto zapozna\u0107 si\u0119 z nowo\u015bciami.<\/p>\n","innerContent":["\n<p>Zawsze powtarzam, \u017ce kolejne wydania TypeScript s\u0105 dla mnie ma\u0142ymi \u015bwi\u0119tami. Kolejne takie wydarzenie zbli\u017ca si\u0119 wielkimi krokami, bo kilka dni temu ukaza\u0142a si\u0119 beta wersji 4.5 tego j\u0119zyk (co oznacza, \u017ce pe\u0142ne wydanie ujrzymy za mniej\/wi\u0119cej dwa miesi\u0105ce). Tak jak w przypadku kilku ostatnich wersji mamy tu do czynienia raczej z ewolucj\u0105, a nie rewolucj\u0105, ale wci\u0105\u017c warto zapozna\u0107 si\u0119 z nowo\u015bciami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najwi\u0119ksze nadchodz\u0105ce zmiany dotycz\u0105 modu\u0142\u00f3w w Node.js. Do compilerOptions dodane zosta\u0142y dwa nowe wspierane rodzaje wspieranych modu\u0142\u00f3w: \u2018node12\u2019 i \u2018nodenext\u2019. Nowe opcje pozwol\u0105 emitowa\u0107 pliki JavaScript wspieraj\u0105ce ECMAScript Modules (te s\u0105 wspierane w\u0142a\u015bnie od Node.js 12). Nowy TypeScript b\u0119dzie uwzgl\u0119dnia\u0142 r\u00f3wnie\u017c pole type w package.json, aby w odpowiedni spos\u00f3b importowa\u0107 pliki .ts i .tsx. To jeszcze nie koniec, bo Typescript dostanie swoje odpowiedniki plik\u00f3w o rozszerzeniu .mjs (.mts) i .cjs (.cts).<\/p>\n","innerContent":["\n<p>Najwi\u0119ksze nadchodz\u0105ce zmiany dotycz\u0105 modu\u0142\u00f3w w Node.js. Do compilerOptions dodane zosta\u0142y dwa nowe wspierane rodzaje wspieranych modu\u0142\u00f3w: \u2018node12\u2019 i \u2018nodenext\u2019. Nowe opcje pozwol\u0105 emitowa\u0107 pliki JavaScript wspieraj\u0105ce ECMAScript Modules (te s\u0105 wspierane w\u0142a\u015bnie od Node.js 12). Nowy TypeScript b\u0119dzie uwzgl\u0119dnia\u0142 r\u00f3wnie\u017c pole type w package.json, aby w odpowiedni spos\u00f3b importowa\u0107 pliki .ts i .tsx. To jeszcze nie koniec, bo Typescript dostanie swoje odpowiedniki plik\u00f3w o rozszerzeniu .mjs (.mts) i .cjs (.cts).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2768,"width":587,"height":419,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/giphy.gif\" alt=\"\" class=\"wp-image-2768\" width=\"587\" height=\"419\"\/><figcaption>Modu\u0142y w Node.js wci\u0105\u017c potrafi\u0105 przyprawi\u0107 o zawr\u00f3t g\u0142owy, ale programi\u015bci Node.js na pewno doceni\u0105 nadchodz\u0105ce usprawnienia.<\/figcaption><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/giphy.gif\" alt=\"\" class=\"wp-image-2768\" width=\"587\" height=\"419\"\/><figcaption>Modu\u0142y w Node.js wci\u0105\u017c potrafi\u0105 przyprawi\u0107 o zawr\u00f3t g\u0142owy, ale programi\u015bci Node.js na pewno doceni\u0105 nadchodz\u0105ce usprawnienia.<\/figcaption><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na szcz\u0119\u015bcie nie samym Node.js cz\u0142owiek \u017cyje i do TypeScript zmierza te\u017c kilka nowo\u015bci, kt\u00f3re zainteresuj\u0105 tych zajmuj\u0105cych si\u0119 g\u0142\u00f3wnie kodem uruchamianym w przegl\u0105darkach. W nadchodz\u0105cej wersji j\u0119zyka od Microsoftu znajdziemy nowy utility type Awaited. Jego zadaniem jest sp\u0142aszczenie wszystkich struktur opartych o Promise i PromiseLike. Je\u015bli na co dzie\u0144 nie modelujecie skomplikowanych struktur danych to r\u00f3wnie\u017c na nim skorzystacie, bo Promise.all, Promise.race b\u0119d\u0105 wykorzystywa\u0107 go w swoich deklaracjach.<\/p>\n","innerContent":["\n<p>Na szcz\u0119\u015bcie nie samym Node.js cz\u0142owiek \u017cyje i do TypeScript zmierza te\u017c kilka nowo\u015bci, kt\u00f3re zainteresuj\u0105 tych zajmuj\u0105cych si\u0119 g\u0142\u00f3wnie kodem uruchamianym w przegl\u0105darkach. W nadchodz\u0105cej wersji j\u0119zyka od Microsoftu znajdziemy nowy utility type Awaited. Jego zadaniem jest sp\u0142aszczenie wszystkich struktur opartych o Promise i PromiseLike. Je\u015bli na co dzie\u0144 nie modelujecie skomplikowanych struktur danych to r\u00f3wnie\u017c na nim skorzystacie, bo Promise.all, Promise.race b\u0119d\u0105 wykorzystywa\u0107 go w swoich deklaracjach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"javascript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ A = string\ntype A = Awaited&lt;Promise&lt;string>>;\n\n\/\/ B = number\ntype B = Awaited&lt;Promise&lt;Promise&lt;number>>>;\n\n\/\/ C = boolean | number\ntype C = Awaited&lt;boolean | Promise&lt;number>>;\n\ndeclare function MaybePromise&lt;T>(value: T): T | Promise&lt;T> | PromiseLike&lt;T>;\n\nasync function doSomething(): Promise&lt;[number, number]> {\n    const result = await Promise.all([\n        MaybePromise(100),\n        MaybePromise(200)\n    ]);\n\n    \/\/ in Typescript 4.4 this caused following error:\n    \/\/    [number | Promise&lt;100>, number | Promise&lt;200>]\n    \/\/\n    \/\/ is not assignable to type\n    \/\/\n    \/\/    [number, number]\n    return result;\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ A = string\ntype A = Awaited&lt;Promise&lt;string>>;\n\n\/\/ B = number\ntype B = Awaited&lt;Promise&lt;Promise&lt;number>>>;\n\n\/\/ C = boolean | number\ntype C = Awaited&lt;boolean | Promise&lt;number>>;\n\ndeclare function MaybePromise&lt;T>(value: T): T | Promise&lt;T> | PromiseLike&lt;T>;\n\nasync function doSomething(): Promise&lt;[number, number]> {\n    const result = await Promise.all([\n        MaybePromise(100),\n        MaybePromise(200)\n    ]);\n\n    \/\/ in Typescript 4.4 this caused following error:\n    \/\/    [number | Promise&lt;100>, number | Promise&lt;200>]\n    \/\/\n    \/\/ is not assignable to type\n    \/\/\n    \/\/    [number, number]\n    return result;\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Do TypeScript 4.5 wersji zmierza te\u017c wsparcie dla dw\u00f3ch ECMAScript proposals. Pierwszy z nich to sprawdzanie obecno\u015bci prywatnych p\u00f3l w klasach, a drugi to import assertions pozwalaj\u0105cy na import obiektu z pliku json.<\/p>\n","innerContent":["\n<p>Do TypeScript 4.5 wersji zmierza te\u017c wsparcie dla dw\u00f3ch ECMAScript proposals. Pierwszy z nich to sprawdzanie obecno\u015bci prywatnych p\u00f3l w klasach, a drugi to import assertions pozwalaj\u0105cy na import obiektu z pliku json.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"javascript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">class Person {\n    #name: string;\n    constructor(name: string) {\n        this.#name = name;\n    }\n\n    equals(other: unknown) {\n        return other &amp;&amp;\n            typeof other === \"object\" &amp;&amp;\n            #name in other &amp;&amp; \/\/ &lt;- this is new!\n            this.#name === other.#name;\n    }\n}\n\nimport obj from \".\/something.json\" assert { type: \"json\" };<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">class Person {\n    #name: string;\n    constructor(name: string) {\n        this.#name = name;\n    }\n\n    equals(other: unknown) {\n        return other &amp;&amp;\n            typeof other === \"object\" &amp;&amp;\n            #name in other &amp;&amp; \/\/ &lt;- this is new!\n            this.#name === other.#name;\n    }\n}\n\nimport obj from \".\/something.json\" assert { type: \"json\" };<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie to tylko kilka z nadchodz\u0105cych zmian. Je\u015bli jeste\u015bcie ciekawi co jeszcze trafi do nowego TypeScriptu to zapraszamy do \u015bwietnie przygotowanej przez Microsoft notatki, kt\u00f3r\u0105 znajdziecie w \u017ar\u00f3d\u0142ach. My natomiast przyjrzymy si\u0119 im dok\u0142adnie kiedy kurz opadnie i wydana zostanie ostateczna wersja j\u0119zyka.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie to tylko kilka z nadchodz\u0105cych zmian. Je\u015bli jeste\u015bcie ciekawi co jeszcze trafi do nowego TypeScriptu to zapraszamy do \u015bwietnie przygotowanej przez Microsoft notatki, kt\u00f3r\u0105 znajdziecie w \u017ar\u00f3d\u0142ach. My natomiast przyjrzymy si\u0119 im dok\u0142adnie kiedy kurz opadnie i wydana zostanie ostateczna wersja j\u0119zyka.<\/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:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-5-beta\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-5-beta\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-5-beta\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-5-beta\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. React Native 0.66<\/h2>\n","innerContent":["\n<h2>2. React Native 0.66<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W minionym tygodniu, zgodnie z planem releasowym, powitali\u015bmy kolejn\u0105 wersj\u0119 React Native. W nowym wydaniu znalaz\u0142o si\u0119:<\/p>\n","innerContent":["\n<p>W minionym tygodniu, zgodnie z planem releasowym, powitali\u015bmy kolejn\u0105 wersj\u0119 React Native. W nowym wydaniu znalaz\u0142o si\u0119:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li>Wsparcie dla klikni\u0119\u0107 w widoki wyrenderowane poza rodzicem<\/li><li>Wsparcie dla nowych pozwole\u0144 na dost\u0119p do Bluetoth na Androidzie<\/li><li>Usprawnione wsparcie dla Apple Silicon, Xcode 13 i iOS15<\/li><li>Nowa wersja Hermes (0.9.0)<\/li><\/ul>\n","innerContent":["\n<ul><li>Wsparcie dla klikni\u0119\u0107 w widoki wyrenderowane poza rodzicem<\/li><li>Wsparcie dla nowych pozwole\u0144 na dost\u0119p do Bluetoth na Androidzie<\/li><li>Usprawnione wsparcie dla Apple Silicon, Xcode 13 i iOS15<\/li><li>Nowa wersja Hermes (0.9.0)<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nie znajdziemy tutaj nic wstrz\u0105saj\u0105co ciekawego, ale co\u015b podpowiada mi, \u017ce wielu z Was zainteresuj\u0105 te zmiany.<\/p>\n","innerContent":["\n<p>Nie znajdziemy tutaj nic wstrz\u0105saj\u0105co ciekawego, ale co\u015b podpowiada mi, \u017ce wielu z Was zainteresuj\u0105 te zmiany.<\/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:\/\/reactnative.dev\/blog\/2021\/10\/01\/version-066\">https:\/\/reactnative.dev\/blog\/2021\/10\/01\/version-066<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/reactnative.dev\/blog\/2021\/10\/01\/version-066\">https:\/\/reactnative.dev\/blog\/2021\/10\/01\/version-066<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Nowa biblioteka do zarz\u0105dzania stanem: Elf<\/h2>\n","innerContent":["\n<h2>3. Nowa biblioteka do zarz\u0105dzania stanem: Elf<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kojarzycie bibliotek\u0119 do zarz\u0105dzania stanem aplikacji Akita? Je\u015bli tak, to zapewne zdziwi Was fakt, \u017ce jej tw\u00f3rca w zesz\u0142ym tygodniu opublikowa\u0142 now\u0105 bibliotek\u0119 do zarz\u0105dzania stanem aplikacji Elf. Przygl\u0105daj\u0105c si\u0119 dokumentacji obydwu rozwi\u0105za\u0144 trudno nie dostrzec mi\u0119dzy nimi podobie\u0144stw. Jak twierdzi Netanel Basal Akita nie jest zagro\u017cona i nadal b\u0119dzie rozwijana, a nowa biblioteka ma by\u0107 rozwijana bardziej w kierunku wyznaczonym przez spo\u0142eczno\u015b\u0107 ni\u017c Datoram\u0119 (komercyjnego sponsora biblioteki). Jedno trzeba przyzna\u0107: Elf od pocz\u0105tku przygotowywany jest z my\u015bl\u0105 o wielu frameworkach i powinien sprawdza\u0107 si\u0119 nie tylko w Angularze.<\/p>\n","innerContent":["\n<p>Kojarzycie bibliotek\u0119 do zarz\u0105dzania stanem aplikacji Akita? Je\u015bli tak, to zapewne zdziwi Was fakt, \u017ce jej tw\u00f3rca w zesz\u0142ym tygodniu opublikowa\u0142 now\u0105 bibliotek\u0119 do zarz\u0105dzania stanem aplikacji Elf. Przygl\u0105daj\u0105c si\u0119 dokumentacji obydwu rozwi\u0105za\u0144 trudno nie dostrzec mi\u0119dzy nimi podobie\u0144stw. Jak twierdzi Netanel Basal Akita nie jest zagro\u017cona i nadal b\u0119dzie rozwijana, a nowa biblioteka ma by\u0107 rozwijana bardziej w kierunku wyznaczonym przez spo\u0142eczno\u015b\u0107 ni\u017c Datoram\u0119 (komercyjnego sponsora biblioteki). Jedno trzeba przyzna\u0107: Elf od pocz\u0105tku przygotowywany jest z my\u015bl\u0105 o wielu frameworkach i powinien sprawdza\u0107 si\u0119 nie tylko w Angularze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"javascript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { Store, createState, withProps, select } from '@ngneat\/elf';\nimport { withEntities, selectAll, setEntities } from '@ngneat\/elf-entities';\n\ninterface TodosProps {\n  filter: 'ALL' | 'ACTIVE' | 'COMPLETED';\n}\n\ninterface Todo {\n  id: string;\n  title: string;\n  status: string;\n}\n\nconst { state, config } = createState(\n  withProps&lt;TodosProps>({ filter: 'ALL' }),\n  withEntities&lt;Todo>()\n);\n\nconst store = new Store({ name: 'todos', state, config });\n\nexport const filter$ = store.pipe(select(({ filter }) => filter));\nexport const todos$ = store.pipe(selectAll());\n\nexport function setTodos(todos: Todo[]) {\n  store.reduce(setEntities(todos));\n}\n\nexport function updateFilter(filter: TodosProps['filter']) {\n  store.reduce(state => ({\n    ...state,\n    filter\n  }));\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { Store, createState, withProps, select } from '@ngneat\/elf';\nimport { withEntities, selectAll, setEntities } from '@ngneat\/elf-entities';\n\ninterface TodosProps {\n  filter: 'ALL' | 'ACTIVE' | 'COMPLETED';\n}\n\ninterface Todo {\n  id: string;\n  title: string;\n  status: string;\n}\n\nconst { state, config } = createState(\n  withProps&lt;TodosProps>({ filter: 'ALL' }),\n  withEntities&lt;Todo>()\n);\n\nconst store = new Store({ name: 'todos', state, config });\n\nexport const filter$ = store.pipe(select(({ filter }) => filter));\nexport const todos$ = store.pipe(selectAll());\n\nexport function setTodos(todos: Todo[]) {\n  store.reduce(setEntities(todos));\n}\n\nexport function updateFilter(filter: TodosProps['filter']) {\n  store.reduce(state => ({\n    ...state,\n    filter\n  }));\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A Wy co o tym my\u015blicie? Czy spo\u0142eczno\u015b\u0107 naprawd\u0119 potrzebuje kolejnej biblioteki do zarz\u0105dzania stanem?<\/p>\n","innerContent":["\n<p>A Wy co o tym my\u015blicie? Czy spo\u0142eczno\u015b\u0107 naprawd\u0119 potrzebuje kolejnej biblioteki do zarz\u0105dzania stanem?<\/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:\/\/github.com\/ngneat\/elf\">https:\/\/github.com\/ngneat\/elf<\/a><br><a href=\"https:\/\/ngneat.github.io\/elf\/\">https:\/\/ngneat.github.io\/elf\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/github.com\/ngneat\/elf\">https:\/\/github.com\/ngneat\/elf<\/a><br><a href=\"https:\/\/ngneat.github.io\/elf\/\">https:\/\/ngneat.github.io\/elf\/<\/a><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10071","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=10071"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10071\/revisions"}],"predecessor-version":[{"id":10619,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10071\/revisions\/10619"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/7724"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}