{"id":231505,"date":"2023-01-08T11:35:00","date_gmt":"2023-01-08T08:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231505"},"modified":"2022-12-25T19:00:44","modified_gmt":"2022-12-25T16:00:44","slug":"typescript-wybrane-wlasciwosci-opcjonalne-z-czesciowym-i-pominieciem","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/typescript-wybrane-wlasciwosci-opcjonalne-z-czesciowym-i-pominieciem\/","title":{"rendered":"TypeScript: wybrane w\u0142a\u015bciwo\u015bci opcjonalne z cz\u0119\u015bciowym i pomini\u0119ciem"},"content":{"rendered":"\n<p>Gdy u\u017cywasz narz\u0119dzia <code>Partial<\/code>do typu, wszystkie w\u0142a\u015bciwo\u015bci typu staj\u0105 si\u0119 opcjonalne. Zobaczmy, jak mo\u017cemy skomponowa\u0107 to narz\u0119dzie z innym, <code>Omit<\/code>, aby uczyni\u0107 opcjonalnymi tylko niekt\u00f3re w\u0142a\u015bciwo\u015bci tego typu. W ko\u0144cu utworzymy typ narz\u0119dzia za pomoc\u0105 generyk\u00f3w TypeScript, aby zastosowa\u0107 to na dowolnym typie.<\/p>\n<h2>Ustaw wszystkie w\u0142a\u015bciwo\u015bci typu jako opcjonalne<\/h2>\n<p>Narz\u0119dzia <code>Partial<\/code>i <code>Omit<\/code>s\u0105 dobrze znane w dziedzinie <a href=\"https:\/\/startfunction.com\/tag\/typescript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">TypeScript<\/a>, poniewa\u017c s\u0105 bardzo przydatne do szybkiego zastosowania ich do typu i uzyskania zasadniczo nowego typu. <code>Partial&lt;T&gt;<\/code>przekonwertuje wszystkie klucze danego typu na opcjonalne. Je\u015bli na przyk\u0142ad masz ten typ:<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n    keyboard: string\n}<\/code><\/pre>\n<p>wszystkie w\u0142a\u015bciwo\u015bci s\u0105 wymagane, gdy co\u015b ma ten typ. Je\u015bli chcesz przypisa\u0107 taki obiekt:<\/p>\n<pre><code>const FooFighters: Band = {\n    lead: 'Dave Grohl',\n    guitar: 'Pat Smears',\n    bass: 'Nate Mendel',\n    drums: 'Taylor Williams',\n}<\/code><\/pre>\n<p>nie powiedzie si\u0119, poniewa\u017c brakuje <code>keyboard<\/code>w\u0142a\u015bciwo\u015bci. Teraz mogliby\u015bmy oznaczy\u0107 t\u0119 w\u0142a\u015bciwo\u015b\u0107 jako opcjonaln\u0105, a TypeScript \u0142atwo nam to umo\u017cliwia. Najprostszym sposobem na to jest dodanie znaku zapytania do jego nazwy. W takim przypadku, je\u015bli istnieje mo\u017cliwo\u015b\u0107 edycji oryginalnego typu, mo\u017cesz przej\u015b\u0107 do niego i zmodyfikowa\u0107 go w ten spos\u00f3b:<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n    keyboard?: string\n}<\/code><\/pre>\n<p>\u015awietny. Teraz poprzednie zadanie si\u0119 powiedzie, poniewa\u017c <code>keyboard<\/code>nie jest ju\u017c wymagane. Ale co, je\u015bli z jakiegokolwiek powodu nie mo\u017cna zmieni\u0107 oryginalnego typu? To, co mo\u017cesz szybko zrobi\u0107 w takich przypadkach, to zastosowa\u0107 <code>Partial<\/code>si\u0119 do tego typu:<\/p>\n<pre><code>type NotAllTheBand = Partial\n\nconst FooFighters: NotAllTheBand = {\n    lead: 'Dave Grohl',\n    guitar: 'Pat Smears',\n    bass: 'Nate Mendel',\n    drums: 'Taylor Williams',\n}<\/code><\/pre>\n<p>To przestaje wymusza\u0107 wszystkie w\u0142a\u015bciwo\u015bci, czyni\u0105c je opcjonalnymi. Mo\u017ce czasami tego chcemy, ale co, je\u015bli chcemy, aby tylko jedna w\u0142a\u015bciwo\u015b\u0107 by\u0142a opcjonalna i unikn\u0105\u0107 modyfikowania oryginalnego typu?<\/p>\n<h2>Usuwanie w\u0142a\u015bciwo\u015bci z typu<\/h2>\n<p>Zanim przejdziemy do tego i zobaczymy, jak to dzia\u0142a, zobaczmy inne narz\u0119dzie, kt\u00f3re nam w tym pomo\u017ce: <code>Omit<\/code>. Ten typ narz\u0119dzia usuwa w\u0142a\u015bciwo\u015bci z typu, w kt\u00f3rym jest stosowany. Chocia\u017c <code>Partial<\/code>nie przyjmuje innych argument\u00f3w ni\u017c typ, <code>Omit<\/code>przyjmuje typ oraz w\u0142a\u015bciwo\u015bci, kt\u00f3re chcesz usun\u0105\u0107: <code>Omit&lt;T, K&gt;<\/code>.<\/p>\n<p>To nie jest tak <code>Partial<\/code>, \u017ce czyni je opcjonalnymi: <code>Omit<\/code>ca\u0142kowicie wymazuje je z typu. Kiedy u\u017cywasz <code>Partial&lt;Band&gt;<\/code>, to tak, jakby\u015b to zrobi\u0142:<\/p>\n<pre><code>interface Band {\n    lead?: string\n    guitar?: string\n    bass?: string\n    drums?: string\n    keyboard?: string\n}<\/code><\/pre>\n<p>Jednak gdy u\u017cywasz <code>Omit&lt;Band, 'keyboard'&gt;<\/code>, to tak, jakby\u015b to zrobi\u0142:<\/p>\n<pre><code>interface Band {\n    lead: string\n    guitar: string\n    bass: string\n    drums: string\n}<\/code><\/pre>\n<p>Teraz zaczyna to mie\u0107 sens, prawda? Czy mo\u017cesz sobie wyobrazi\u0107, co mogliby\u015bmy zrobi\u0107 w TypeScript, je\u015bli mamy typ, kt\u00f3ry ma wszystkie w\u0142a\u015bciwo\u015bci oryginalnego zestawu jako opcjonalny, a inny typ ma tylko te w\u0142a\u015bciwo\u015bci, kt\u00f3rych chcemy wymaga\u0107? Gdyby tylko istnia\u0142 spos\u00f3b\u2026 przecinania si\u0119 tych typ\u00f3w, prawda?<\/p>\n<h2>Przecinaj\u0105ce si\u0119 typy<\/h2>\n<p>Tak, w TypeScript mo\u017cna u\u017cy\u0107 znaku ampersand <code>&amp;<\/code>, operatora przeci\u0119cia typu. Ten operator, maj\u0105c dwa typy, konstruuje nowy z w\u0142a\u015bciwo\u015bciami nale\u017c\u0105cymi do obu typ\u00f3w:<\/p>\n<pre><code>interface SomeType {\n    propA: string\n    propB: number\n}\n\ninterface AnotherType {\n    propC: boolean\n    propD: Array\n}\n\ntype IntersectedType = SomeType &amp; AnotherType\n<\/code><\/pre>\n<p>Do tej pory prawdopodobnie ju\u017c si\u0119 zorientowa\u0142e\u015b: zamierzamy przeci\u0105\u0107 typ cz\u0119\u015bciowy i typ, w kt\u00f3rym usun\u0119li\u015bmy niekt\u00f3re jego w\u0142a\u015bciwo\u015bci.<\/p>\n<h2>Ustaw wybrane w\u0142a\u015bciwo\u015bci typu jako opcjonalne<\/h2>\n<p>Spr\u00f3bujmy to zrozumie\u0107. Podczas nauki j\u0119zyka TypeScript wa\u017cne jest, aby zracjonalizowa\u0107 to, co dzieje si\u0119 z naszymi typami.<\/p>\n<p>Zamierzamy pobra\u0107 typ, kt\u00f3ry ma wszystkie w\u0142a\u015bciwo\u015bci ustawione jako opcjonalne dzi\u0119ki <code>Partial<\/code>zastosowaniu na nim. Nast\u0119pnie przetniemy go z typem, kt\u00f3ry ma wybrane w\u0142a\u015bciwo\u015bci usuni\u0119te przez <code>Omit<\/code>. Zobaczmy przyk\u0142ad:<\/p>\n<pre><code>interface SomeType {\n    propA: string\n    propB: number\n}\n\ntype OptionalPropB = Partial &amp; Omit<\/code><\/pre>\n<p>Mamy teraz nowy typ, bez modyfikowania oryginalnego typu, kt\u00f3ry wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre><code>type OptionalPropB = {\n    propA: string\n    propB?: string\n}<\/code><\/pre>\n<p>Dzieje si\u0119 tak, poniewa\u017c pobieramy w\u0142a\u015bciwo\u015bci <code>propA?<\/code>z <code>propB?<\/code>typu produkowanego przez <code>Partial<\/code>i przecinamy je z <code>propA<\/code>typem produkowanym przez <code>Omit<\/code>.<\/p>\n<h2>Og\u00f3lne narz\u0119dzia TypeScript<\/h2>\n<p>Ok, teraz nasz nowy typ dzia\u0142a i mo\u017cemy mie\u0107 tylko wybrane w\u0142a\u015bciwo\u015bci oznaczone jako opcjonalne bez modyfikowania oryginalnego typu. Jednak ta linia<\/p>\n<pre><code>type OptionalPropB = Partial &amp; Omit<\/code><\/pre>\n<p>Jest zbyt gadatliwy, do\u015b\u0107 brzydki i nu\u017c\u0105cy, by pisa\u0107 za ka\u017cdym razem. Co wa\u017cniejsze, nie zadzia\u0142a dla innego typu, za ka\u017cdym razem b\u0119dziemy musieli napisa\u0107 to od nowa. Czy mo\u017cemy go skr\u00f3ci\u0107 i upi\u0119kszy\u0107 i sprawi\u0107, by dzia\u0142a\u0142 dla ka\u017cdego typu? Tak, TypeScript pozwala nam tutaj u\u017cy\u0107 generyk\u00f3w i stworzy\u0107 w\u0142asny typ narz\u0119dzia:<\/p>\n<pre><code>type Optional = Partial &amp; Omit<\/code><\/pre>\n<p>A teraz mamy w\u0142asny typ narz\u0119dzia TypeScript zaimplementowany z rodzajami, kt\u00f3rych mo\u017cemy u\u017cy\u0107, aby uczyni\u0107 wybrane w\u0142a\u015bciwo\u015bci typu opcjonalnymi w dowolnym typie. Mo\u017cemy go u\u017cy\u0107 tak:<\/p>\n<pre><code>type TypeWithOptionalProp = Optional<\/code><\/pre>\n<p>Zauwa\u017cysz, \u017ce podpis jest podobny do Pomi\u0144: to narz\u0119dzie przyjmuje typ, na kt\u00f3rym ma dzia\u0142a\u0107, oraz w\u0142a\u015bciwo\u015bci, kt\u00f3re b\u0119d\u0105 opcjonalne. Je\u015bli masz wi\u0119cej, mo\u017cesz skorzysta\u0107 z operatora union:<\/p>\n<pre><code>type TypeWithOptionalProps = Optional<\/code><\/pre>\n<h2>S\u0142owa zamykaj\u0105ce<\/h2>\n<p>Mo\u017cesz teraz zapisa\u0107 ten og\u00f3lny typ narz\u0119dzia w pliku i wyeksportowa\u0107 go, aby u\u017cywa\u0107 go w ca\u0142ej aplikacji. Oto <a href=\"https:\/\/www.typescriptlang.org\/play?#code\/JYOwLgpgTgZghgYwgAgMoHsC2EAqBPABxQG8AoZC5AqdAgQQC5kBnMKUAc3MutoCEmIAK6YARtG4VeBAMJNR6dABsIcEKQC+pUqEixEKOiHRgAFtHxFkZSlRr0mrdiC63pc5AuWr1W0mEIUAAU4KDBgOCVLFABeZBCwiKUAHgxsaIA+f0DkAHlMYDBo5Dj8wtSsXECAGmQAcmk+OqyAqwBJcGhmCARIABNiuLSqqwAyZCMTcyho7KtcgnD0EEig+z4S+NDwyIr0wIzkcbKwPZGIWob15u0AelvkHCg8ZCgITHQAN047Wjpaxq1dBQX6yWpgdDIT7QYAwF5mCB4OpvZC0JYrJQAOlICGWrGQkFYAEYmAkdlEcnEbKDGPVREohBA6tVuI0mESAEwAZhZUnsHjYjJZGgA3HcHk8XnA+n0fo0CZDoew4chCnVmK8IABHITAN59bG4kD4wlgDlME6Days+y0ur0xnMm20AVQIWaMWke6PZ6aj7fFw0gHrIEg9zgxUwlUIpEot46vUQA04vFgAkQVhcpgdPTdXpJq3U6R2h1M3mggTITk852yJiCi4e8U+qUyuXrBVQqMvNUatHAZaRbHeyV+r7tv6osP8ztK2E9sDqzUJ-WG1Pp1gAFgtiwHGLW-E2RdtTHtDLLtdd7tFzYA4gBRABy94ASm0ZMgAKo4NoAGTaOAAJoAIRzCgCzorsOC1AA0sgEAAB6QCAfQagA1oi6AwI8hxxGSSTJDghzHAUpzQcgMFZGBjyBAA6oUpgQXuqz2BqpS7oOKTDNElyNHUyAAD71O4NxehKvrSrKgbysCoIfhCXbKvC5ixig-accO4kvG8-oTvQs7dqqi4avGuqrimxppqaACsTDRPRZhMZxB4EGx1p8n8p6lk6opAA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">link do placu zabaw TypeScript<\/a>, w kt\u00f3rym doda\u0142em kod z tego artyku\u0142u i skomentowa\u0142em go, dzi\u0119ki czemu mo\u017cna zobaczy\u0107, co si\u0119 dzieje, patrz\u0105c na <code>Partial<\/code>, <code>Omit<\/code>i nasz og\u00f3lny typ narz\u0119dzia.<\/p>\n<p>\u015awiat generyk\u00f3w i narz\u0119dzi jest fantastyczny w TypeScript. Wejd\u017a w to i zacznij eksperymentowa\u0107!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>U\u017cyj opcji Cz\u0119\u015bciowe i pomi\u0144, aby uczyni\u0107 opcjonalnymi tylko niekt\u00f3re w\u0142a\u015bciwo\u015bci typu.<\/p>\n","protected":false},"author":1,"featured_media":236900,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,732,897,752,845,866],"tags":[1169],"class_list":["post-231505","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-javascript-7","category-kod","category-otwarte-zrodlo","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=231505"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231505\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236900"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}