<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>minimal__.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 12 Sep 2021 05:41:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>minimal__.log</title>
            <url>https://images.velog.io/images/minimal__/profile/3c6a7597-ab26-487a-83cb-739f5bedfe4a/profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. minimal__.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minimal__" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[아직도 써먹기 힘든 TS - 유틸리티 타입 / Partial]]></title>
            <link>https://velog.io/@minimal__/%EC%95%84%EC%A7%81%EB%8F%84-%EC%8D%A8%EB%A8%B9%EA%B8%B0-%ED%9E%98%EB%93%A0-TS-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85-ftig8c1z</link>
            <guid>https://velog.io/@minimal__/%EC%95%84%EC%A7%81%EB%8F%84-%EC%8D%A8%EB%A8%B9%EA%B8%B0-%ED%9E%98%EB%93%A0-TS-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85-ftig8c1z</guid>
            <pubDate>Sun, 12 Sep 2021 05:41:19 GMT</pubDate>
            <description><![CDATA[<hr>
<hr>
<p>TS에는 타입 적용에 편리한 기능을 미리 정의해논 &#39;<strong>유틸리티 타입</strong>&#39; 이란게 있다.<br>이걸 잘 쓰면 부분 추출, 부분 제거, 전체 속성 변경 등 손가락을 덜 혹사시키면서 코딩이 가능하다.<br>잘 써먹을 수 있도록 유틸리티 타입을 공부 및 모사해보자 👊  </p>
<hr>
<hr>
<h1 id="목차">목차</h1>
<ol>
<li>유틸리티 타입 종류</li>
<li>Partial&lt;T&gt;<ol>
<li>TS 지식</li>
<li>PartialPerson 만들기</li>
<li>PartialPerson에 제네릭 적용하기</li>
</ol>
</li>
</ol>
<h2 id="1-유틸리티-타입-종류">1. 유틸리티 타입 종류</h2>
<p>타입스크립트에서 만들어 논 타입 변환을 용이하게 도와주는 도구!  
유틸리티 타입은 어떤게 있을까?  </p>
<p><code>Partial&lt;T&gt;, Required&lt;T&gt;, ReadOnly&lt;T&gt;, ...</code>  </p>
<p>공식문서에서 안내되고 있는 건 총 20개다.<br>많긴한데 Partial부터 차근차근 분석해보자!</p>
<blockquote>
<p>참고: <a href="https://www.typescriptlang.org/docs/handbook/utility-types.html">유틸리티 타입 - 공식문서</a></p>
</blockquote>
<h2 id="2-partialt">2. Partial&lt;T&gt;</h2>
<p>타입 T의 모든 속성을 <font color="EA5455"><strong>Optional</strong></font> 하게 만드는 타입이다.<br>그래서 T의 일부는 있고 일부는 없어도 되는 타입을 만든다.  </p>
<p>타입스크립트에 이미 정의된 코드를 살펴보자.  </p>
<pre><code class="language-typescript">type Partial&lt;T&gt; = {
  [P in keyof T]?: T[P];
}</code></pre>
<p>keyof, in, ? 등 알듯말듯한데, 코드는 생각보다 간단하다.
알듯말듯한 구성요소들을 알아보자.  </p>
<h3 id="ts-지식">TS 지식</h3>
<hr>
<h4 id="div-idkeyofkeyof-연산자div"><div id="keyof">keyof 연산자</div></h4>
<p>오브젝트 타입의 키를 <font color="EA5455">유니온 타입</font>으로 뽑아내는 연산자  </p>
<blockquote>
<p>참고: <a href="https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types">유니온 타입 - 공식문서</a>
참고: <a href="https://www.typescriptlang.org/docs/handbook/2/keyof-types.html#the-keyof-type-operator">keyof 연산자 - 공식문서</a></p>
</blockquote>
<hr>
<h4 id="div-ida_in_ba-in-b-문법div"><div id="a_in_b">[A in B] 문법</div></h4>
<p>자바스크립트의 <font color="EA5455">for in 문법</font>과 유사하게 동작하는 문법<br>반복문을 이용하여 타입을 선언할 때 사용된다.<br><strong>유니온 타입인 B</strong>의 요소들이 하나씩 A에 반영되며 작업을 반복하여 처리하는 방식이다.  </p>
<blockquote>
<p>참고: <a href="https://stackoverflow.com/questions/50214731/what-does-the-in-keyword-do-in-typescript">타입스크립트의 in 동작방식 - 스택오버플로우</a></p>
</blockquote>
<hr>
<h4 id="div-idindexed_access_typetp-문법div"><div id="indexed_access_type">T[P] 문법</div></h4>
<p><strong>Indexed Access Type</strong>으로  오브젝트내 <font color="EA5455">속성의 타입</font>을 뽑아낼때 쓸 수 있다.<br>타입 T의 P 속성에게 설정된 타입을 T[P]로 표현한다.  </p>
<blockquote>
<p>참고: <a href="https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html">Indexed Access Type - 공식문서</a></p>
</blockquote>
<hr>
<h4 id="div-idoptional-키워드div"><div id="optional">? 키워드</div></h4>
<p>오브젝트의 특정 속성이 있을 수도 있고 없을 수도 있는 경우 <font color="EA5455">Optional</font> 이라고 말하며,  <strong>?</strong> 키워드로 표현 가능하다.  </p>
<blockquote>
<p>참고: <a href="https://www.typescriptlang.org/docs/handbook/2/objects.html#optional-properties">Optional - 공식문서</a></p>
</blockquote>
<hr>
<br>

<p>각 요소에 대해 간단하게 정리해봤다.<br>이를 바탕으로 Partial을 한 문장으로 나타내보자.  </p>
<blockquote>
<h4 id="💡-타입-t의-모든-키를-순회하면서-해당-키의-타입에-optional을-추가한다">💡 타입 T의 모든 키를 순회하면서 해당 키의 타입에 Optional을 추가한다.</h4>
</blockquote>
<p>그리고 이 문장으로부터 Partial&lt;T&gt;를 모사해보자.  </p>
<p>우선, 괜히 어렵게 만들 제네릭은 뒤로하고 <code>Person</code>이라는 타입으로 시작한다.<br>유틸리티 타입 <code>Partial&lt;T&gt;</code>을 사용한 <code>Partial&lt;Person&gt;</code>의 결과와 동일한 <code>PartialPerson</code> 타입을 만들어보자.  </p>
<h3 id="partialperson-만들기">PartialPerson 만들기</h3>
<hr>
<p><strong><font color="2D4059">사용할 타입과 원하는 결과</font></strong></p>
<p><em>Person 타입</em></p>
<pre><code class="language-typescript">type Person = {
  name: string;
  age: number;
  height: number;
  weight: number;
}</code></pre>
<p><em>Partial&lt;Person&gt;</em>  </p>
<img src="https://images.velog.io/images/minimal__/post/94835402-dfdc-4f20-85dd-f40c8bc1445d/image.png" width="50%" alt="partial 결과"/>
<br>

<p><strong><font color="2D4059">진행 과정</font></strong></p>
<ol>
<li><code>Person</code>의 키 목록을 가져오고</li>
<li>키 목록을 순회하면서</li>
<li>각 키의 원래 타입을 적용하고</li>
<li>Optinal도 또한 적용한다.</li>
</ol>
<hr>
<h4 id="1-person의-키-목록-가져오기">1. <code>Person</code>의 키 목록 가져오기</h4>
<p><a href="#keyof">keyof</a>를 사용하여 키 목록을 가져와보자.<br>아래 사진처럼 키들이 유니온 타입으로 묶여나온다.</p>
<img src="https://images.velog.io/images/minimal__/post/0cb0ffc5-d29d-4dec-9839-4cc02522eea2/image.png" />
<br>

<h4 id="2-키-목록을-순회하기">2. 키 목록을 순회하기</h4>
<p><a href="#a_in_b">[A in B]</a>의 동작 방식을 익힐 겸 1번의 결과( <code>PersonKeyOf</code> )를 이용하여 <code>MappedPerson</code>이라는 새로운 타입을 만들어보자.  </p>
<p><code>MappedPerson</code>은 모든 키의 타입이 <code>string</code>을 가진다.</p>
<pre><code class="language-typescript">type MappedPerson = {
  [P in PersonKeyOf]: string;
}</code></pre>
<p>keyof + [A in B] 를 이용해서 위처럼 코딩이 가능한데, 결과 사진을 보기전에 어떻게 처리가 될 지 상상해보자.</p>
<p>P가 가지게 되는 값들은 <strong>PersonKeyOf(&#39;name&#39;, &#39;age&#39;, &#39;height&#39;, &#39;weight&#39;)</strong> 이다.</p>
<p>이 4가지 값들로 반복문이 돈다고 생각하면,</p>
<p>P가 <font color="EA5455">name</font> 인 경우, <code>name: string;</code>
P가 <font color="EA5455">age</font> 인 경우, <code>age: string;</code> 
P가 <font color="EA5455">height</font> 인 경우, <code>height: string;</code>
P가 <font color="EA5455">weight</font> 인 경우, <code>weight: string;</code></p>
<p>이런 식의 흐름이 되어 위 4가지가 모인 새로운 타입 <code>MappedPerson</code>이 만들어진다.</p>
<p><em>MappedPerson</em></p>
<img src="https://images.velog.io/images/minimal__/post/e8209e54-7465-4719-aeb8-276a7f81e8b7/image.png" width="50%" alt="MappedPerson" />
<br>

<h4 id="3-각-키의-원래-타입-적용하기">3. 각 키의 원래 타입 적용하기</h4>
<p><code>MappedPerson</code>의 <code>string</code>이 아닌 원래 타입을 가져오기 위해서 <a href="#indexed_access_type">T[P]</a>을 사용하자.
우리 상황에선 <code>T</code>에 해당하는 값은 <code>Person</code>이다.
그렇게 만든 새로운 타입을 <code>IndexedAccessPerson</code>이라 하자.</p>
<pre><code class="language-typescript">type IndexedAccessPerson = {
  [P in PersonKeyOf]: Person[P];
}</code></pre>
<p>동장 방식은 당연히 2번과정과 동일하다. 대신 타입이 다르다.</p>
<p>P가 <font color="EA5455">name</font> 인 경우, 
<code>name: Person[name];</code> → <code>name: string;</code>
P가 <font color="EA5455">age</font> 인 경우,
<code>age: Person[age];</code> → <code>age: number;</code>
P가 <font color="EA5455">height</font> 인 경우,
<code>height: Person[height];</code> → <code>height: number;</code>
P가 <font color="EA5455">weight</font> 인 경우,
<code>weight: Person[weight];</code> → <code>weight: number;</code></p>
<p>최종적으로 적용된 4가지가 모여서 <code>IndexedAccessPerson</code>이 만들어진다.</p>
<p><em>IndexedAccessPerson</em></p>
<img src="https://images.velog.io/images/minimal__/post/e27bd3bc-2d24-4788-8710-d996bd725d53/image.png" width="50%" alt="IndexedAccessPerson" />
<br>

<h4 id="4-optinal-적용하기">4. Optinal 적용하기</h4>
<p><a href="#optional">? 키워드</a>를 <code>:</code> 앞에 붙여주면 최종 타입 <code>PartialPerson</code>이 만들어진다.</p>
<pre><code class="language-typescript">type PartialPerson = {
  [P in PersonKeyOf]?: Person[P]; 
}</code></pre>
<p>과정은 2,3 번을 통해 충분한 연습이 됬다 생각하니 바로 결과 사진을 보자.</p>
<p><em>PartialPerson</em></p>
<img src="https://images.velog.io/images/minimal__/post/921f9bb5-97e2-4275-a08e-6f730aba3394/image.png" width="50%" alt="PartialPerson" />
<br>

<h3 id="partialperson에-제네릭-적용하기">PartialPerson에 제네릭 적용하기</h3>
<pre><code class="language-typescript">type PartialPersonV1 = {
  [P in PersonKeyOf]?: Person[P]; 
}

// 1. PersonKeyOf -&gt; keyof Person
type PartialPersonV2 = {
  [P in keyof Person]?: Person[P]; 
}

// 2. Person -&gt; Generic
type PartialPerson&lt;T&gt; = {
  [P in keyof T]?: T[P]; 
}

// Original Patrial
type Partial&lt;T&gt; = {
  [P in keyof T]?: T[P];
};</code></pre>
<hr>
<p>여기까지 기존 타입에 optional 속성을 추가하는 Partial에 대해 공부했다.</p>
<p>바탕이 되는 개념인 keyof, [A in B], Indexed Access Type, Optional에 대해서도 알 수 있었고, Partial 모사를 통해 독립적이였던 개념들을 연결시킬 수 있었다.</p>
<p>공부하면서 작성한 코드입니다.
<a href="https://codesandbox.io/s/utility-type-6ru2d?file=/src/partial.ts">Optional 모사하기</a></p>
<p>모르고 있던게 많아 정리하면서 진행하느라 분량이 길어졌네요.
나머지 타입들은 다음 포스팅으로 넘기겠습니다.</p>
<hr>
<blockquote>
<p>공부한 내용을 공유하는 글이니 제가 잘못된 정보를 전달할 수도 있습니다. 
그럴 땐 거침없이 태클걸어주세요.</p>
</blockquote>
<hr>
]]></description>
        </item>
    </channel>
</rss>