<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>re_honey.log</title>
        <link>https://velog.io/</link>
        <description>possibilities</description>
        <lastBuildDate>Tue, 14 Feb 2023 06:40:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>re_honey.log</title>
            <url>https://images.velog.io/images/re_honey/profile/a9b92e1f-d50d-47d3-a3d7-78f971fc38c9/KakaoTalk_20220226_203722722.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. re_honey.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/re_honey" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[interface vs. type]]></title>
            <link>https://velog.io/@re_honey/interface-vs.-type</link>
            <guid>https://velog.io/@re_honey/interface-vs.-type</guid>
            <pubDate>Tue, 14 Feb 2023 06:40:49 GMT</pubDate>
            <description><![CDATA[<h3 id="type키워드의-옵션-3가지">type키워드의 옵션 3가지</h3>
<ol>
<li>오브젝트 모양을 설명하는 것<pre><code class="language-ts">type Player1 = {
name: &quot;John&quot;
};</code></pre>
</li>
<li>type alias를 만드는 것<pre><code class="language-ts">type Player2 = number;</code></pre>
</li>
<li>특정된 값으로 만드는 것<pre><code class="language-ts">type Player3 = &quot;1&quot; | &quot;2&quot;</code></pre>
<hr>

</li>
</ol>
<h3 id="type과-interface의-공통점">type과 interface의 공통점</h3>
<ul>
<li>타입스크립트에게 오브젝트의 모양과 타입을 알려주는 역할</li>
<li>추상 클래스(abstract class)를 대체한다.</li>
</ul>
<pre><code class="language-ts">//**type**
type PlayerA = {
  name: string;
};

const playerA: PlayerA = {
  name: &quot;doe&quot;,
};

//**interface**
interface PlayerB {
  name: string;
}

const playerB: PlayerB = {
  name: &quot;doe&quot;,
};

//class

class User implements PlayerB {
  constructor(name: string){}
}
또는
class User implements PlayerA {
  constructor(name: string){}
}</code></pre>
<h3 id="type과-interface의-차이점">type과 interface의 차이점</h3>
<blockquote>
<p>type은 새 property를 추가하기 위해 다시 선언될 수 없지만
interface는 항상 상속이 가능하다.</p>
</blockquote>
<ol>
<li>다른 클래스를 상속할 때의 차이점<pre><code class="language-ts">//type
type PlayerA = {
name: string;
};
</code></pre>
</li>
</ol>
<p>type PlayerAA = PlayerA &amp; {
  age: number;
};</p>
<p>const playerA: PlayerAA = {
  name: &quot;doe&quot;,
  age: 20
};</p>
<p>//interface</p>
<p>interface PlayerB {
  name: string;
}</p>
<p>interface PlayerBB extends PlayerB{
  age: number;
}</p>
<p>const playerB: PlayerBB = {
  name: &quot;doe&quot;,
  age: 20
};</p>
<pre><code>2. 나중에 property를 타입에 추가할 때의 차이점
```ts
//type
type PlayerA = {
  name: string;
};

type PlayerAA = PlayerA &amp; {
  age: number;
};

//🔻 추가할 프로퍼티
type PlayerAA = {
  health: number;
}; // =&gt; ❌ type을 쓸 땐 PlayerAA타입이 이미 정의돼있어서 중복된다.

const playerA: PlayerAA = {
  name: &quot;doe&quot;,
  age: 20
};

//interface

interface PlayerB {
  name: string;
}

//🔻 추가할 프로퍼티
interface PlayerB{
  age: number;
}
interface PlayerB {
  health: number;
} // =&gt; ⭕ 인터페이스를 다시 써주고 추가할 프로퍼티를 써주면 된다.

const playerB: PlayerB = {
  name: &quot;doe&quot;,
  age: 20
};</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트의 Class]]></title>
            <link>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Class</link>
            <guid>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Class</guid>
            <pubDate>Wed, 08 Feb 2023 03:58:08 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-ts">//추상 클래스: 다른 클래스가 상속받을 수만 있는 클래스
abstract class User {
  constructor(
      private firstName: string,
    protected lastName: string,
    public nickName: string
  ) {}
  //아래와 같이 추상클래스안에 추상메서드를 만들려면 내용을 구현하지 말고 
  //위처럼 메서드의 call signature만 작성해야 한다.
  //대신 상속받는 클래스에서 내용을 구현해줘야 한다.
  abstract getNickName(): void

  getFullName() {
    return `${this.firstName} ${this.lastName}`
  }
}

//Player클래스가 User클래스를 상속한다.
//
class Player extends User {

}

const timothy = new Player(&quot;timothy&quot;, &quot;kim&quot;, &quot;tim&quot;);

timothy.lastName; // -&gt; ❌ protected라서 접근 불가능
timothy.nickName // -&gt; ⭕ public이라서 접근 가능

timothy.getFullName();// -&gt; ⭕ call signature로 메소드를 구현해서 접근가능
</code></pre>
<table>
<thead>
<tr>
<th align="center">접근가능여부</th>
<th align="center">선언한 클래스 내</th>
<th align="center">상속받은 클래스 내</th>
<th align="center">인스턴스</th>
</tr>
</thead>
<tbody><tr>
<td align="center">private</td>
<td align="center">⭕</td>
<td align="center">❌</td>
<td align="center">❌</td>
</tr>
<tr>
<td align="center">protected</td>
<td align="center">⭕</td>
<td align="center">⭕</td>
<td align="center">❌</td>
</tr>
<tr>
<td align="center">public</td>
<td align="center">⭕</td>
<td align="center">⭕</td>
<td align="center">⭕</td>
</tr>
</tbody></table>
<hr>

<h3 id="예시">예시</h3>
<p>```ts
/** ↓ Words타입이 string만을 프로퍼티로 가지는 오브젝트라는 것.
제한된 양의 property 혹은 key를 가지는 타입을 정의해주는 방법이다.
객체의 property에 대해 모르지만 타입만을 알 때 유용하다.
**/
type Words = {
  [whatever: string]: string
}</p>
<p>/*
let dict: Words = {
    &quot;potato&quot;: &quot;food&quot;
}
둘 다 string이어야 한다. number라면 number이어야 한다.
*/</p>
<p>class Dict {
  private words: Words
  constructor() {
    this.word = {}
  }//수동으로 초기화
  //단어를 추가하기 위한 메소드
  //클래스를 타입처럼 사용
  //파라미터(word)가 클래스(Word)의 인스턴스이길 원할 때 이렇게 작성.
  add(word: Word) {
    if(this.words[word.term] === undefined) {
      this.words[word.term] = word.def
    }
  }
}</p>
<p>class Word {
  constructor() {
    public term: string,
    public def: string
  }
}</p>
<p>const kimchi = new Word(&quot;kimchi&quot;, &quot;한국의 음식&quot;);</p>
<p>const dict = new Dict();</p>
<p>dict.add(kimchi);</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트의 다형성(polymorphism)]]></title>
            <link>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8B%A4%ED%98%95%EC%84%B1polymorphism</link>
            <guid>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8B%A4%ED%98%95%EC%84%B1polymorphism</guid>
            <pubDate>Sun, 05 Feb 2023 15:25:06 GMT</pubDate>
            <description><![CDATA[<h2 id="polymorphism">Polymorphism?</h2>
<ul>
<li><p>poly : many, multi</p>
</li>
<li><p>morpho : form, structure
=&gt; many different forms</p>
</li>
<li><p>concrete type : number, void, boolean 등 지금까지 배운 타입.</p>
</li>
<li><p>generic type : 타입 placeholder</p>
</li>
</ul>
<h3 id="배열을-받고-그-요소를-하나씩-출력해주는-함수를-만들어-보자">배열을 받고 그 요소를 하나씩 출력해주는 함수를 만들어 보자</h3>
<pre><code class="language-ts">type SuperPrint = {
  (arr: number[]): void)
}

const superPrint: SuperPrint = (arr) =&gt; {
  arr.forEach(i =&gt; console.log(i))
}</code></pre>
<p>이 때, </p>
<pre><code class="language-ts">superPrint(1, 2, 3, 4)//은 가능하다.
//하지만
superPrint(1, 2, true, &quot;4&quot;) //처럼 모든 타입에 대해 함수를 호출하고 싶다고 해서

type SuperPrint = {
  (arr: number[] | string[] | boolean[]): void
} //이렇게 or로 일일히 써주는 것보단 generic을 사용해주는게 좋다.</code></pre>
<p>즉, call signature를 작성할 때, 확실한 타입을 모를 경우에 generic type을 사용한다.</p>
<p>그럴 땐 먼저 타입스크립트에게 generic을 사용하겠다고 말해줘야 한다.</p>
<pre><code class="language-ts">type SuperPrint = {
  &lt;TypePlaceholder&gt;(arr: TypePlaceholder[]): void
  //&lt;&gt;를 아무 이름과 함께 적어주어 generic을 사용하겠다고 말해줌.
  //그리고 타입의 이름도 같은 것으로 적어줌.
}

const superPrint: SuperPrint = (arr) =&gt; {
  arr.forEach(i =&gt; console.log(i))
}

superPrint(1, 2, 3, 4)
//이제 superPrint함수에 마우스를 올려보면 위에 generic으로 적은 call signature가 나오는 걸 볼 수 있다.
//타입스크립트가 알아서 number array라는걸 유추해서 placeholder를 대체해 call signature로 알려주게 된다.</code></pre>
<h3 id="배열을-받고-그-첫-번째-요소를-출력하는-함수를-만들어-보자">배열을 받고 그 첫 번째 요소를 출력하는 함수를 만들어 보자</h3>
<p>보통 간략하게 </p>
<pre><code class="language-ts">&lt;T&gt; 또는 &lt;V&gt; 로 줄여쓴다.</code></pre>
<pre><code class="language-ts">type SuperPrint = {
  &lt;T&gt;(arr: T[]): T
  //이제 void가 아니라 배열을 return하는 함수기 때문에 void대신 TypePlaceholder를 리턴한다고 적어준다.
}

const superPrint: SuperPrint = (arr) =&gt; arr[0] 

const a = superPrint([1, 2, 3, 4])// const a: number
const b = superPrint([true, false, true])// const b: boolean
const c = superPrint([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;])// const c: string
const d = superPrint([1, 2, true, false, &quot;hi&quot;])// const d: string|number|boolean</code></pre>
<ul>
<li>함수에 이렇게 여러 형태가 주어지기 때문에 polymorphism(다형성)이라 한다.</li>
</ul>
<h2 id="generic">Generic</h2>
<ul>
<li>any를 사용하지 않고 generic를 사용하는 이유:<ul>
<li>error에 대해 보호받기 위해서.</li>
</ul>
</li>
</ul>
<h3 id="여러-개의-generic을-선언하는-방법">여러 개의 generic을 선언하는 방법</h3>
<pre><code class="language-ts">type SuperPrint = &lt;T, M&gt;(a: T[], b: M) =&gt; T
const superPrint: SuperPrint = (a, b) =&gt; a[0]

a = superPrint([1, 2], &quot;b&quot;)</code></pre>
<ul>
<li>타입스크립트는 generic을 처음 인식했을 때와 generic의 순서를 기반으로 generic의 타입을 알게 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Typescript에서의 function overloading]]></title>
            <link>https://velog.io/@re_honey/Typescript%EC%97%90%EC%84%9C%EC%9D%98-function-overloading</link>
            <guid>https://velog.io/@re_honey/Typescript%EC%97%90%EC%84%9C%EC%9D%98-function-overloading</guid>
            <pubDate>Thu, 02 Feb 2023 11:58:36 GMT</pubDate>
            <description><![CDATA[<h2 id="function-overloading">Function Overloading</h2>
<ul>
<li>직접 작성하기보다 외부 라이브러리에 자주 보이는 형태로,</li>
<li>하나의 함수가 서로 다른 여러개의 call signature를 가질 때 발생한다.</li>
</ul>
<h3 id="단순한-예시">단순한 예시)</h3>
<pre><code class="language-ts">type Add = {
  (a: number, b: number) : number,
  (a: number, b: string) : number
}

const add: Add = (a, b) =&gt; {
  if(typeof b === &quot;string&quot;) return a //⭕b가 string이면 return값이 number
  return a + b //⭕return값이 number
}</code></pre>
<h3 id="많이-접할-수-있는-예시">많이 접할 수 있는 예시)</h3>
<ul>
<li>Next.js에서 우린 여러 Router를 만들게 된다.</li>
<li>그런데 그 라우터를 string으로 보낼 수도 있지만 Object(객체) 형식으로 보낼 수도 있다.</li>
<li>오버로딩의 좋은 예시이다.<pre><code class="language-js">Router.push(&quot;/home&quot;)
//또는
Router.push({
path: &quot;/home&quot;,
state: 1,
})
</code></pre>
</li>
</ul>
<pre><code>
### 실전예시)
```ts
type Config = {
  path: string,
  state: object
}

type Push = {
  (path: string): void,
  (config: Config): void,
}

const push: Push = (config) =&gt; {
  if(typeof config === &quot;string&quot;) {
    console.log(config)
  } else {
  console.log(config.path)
  }
}</code></pre><h3 id="주의할-점">주의할 점</h3>
<pre><code class="language-ts">type Add = {
  (a: number, b: number): number,
  (a: number, b: number, c: number): number,
}

const add: Add = (a, b, c?:number) =&gt; {
  if(c) return a + b + c
  return a + b;
}

add(1, 2)
add(1, 2, 3)</code></pre>
<ul>
<li>위와 같이 두 개 이상의 call signature들의 parameter의 개수가 다를 때,
c의 경우 옵션이기 때문에 함수를 호출할 때
c의 타입이 아마도 number일 것이다(c?:number) 라고 코드에 적어줘야 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Call Signature]]></title>
            <link>https://velog.io/@re_honey/Call-Signature</link>
            <guid>https://velog.io/@re_honey/Call-Signature</guid>
            <pubDate>Wed, 01 Feb 2023 07:21:41 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-ts">function add(a: number, b: number) {
  return a + b;
}</code></pre>
<pre><code class="language-ts">const add = (a: number, b: number) =&gt; a + b;</code></pre>
<p><img src="https://velog.velcdn.com/images/re_honey/post/a1fbf4ae-cfb6-40db-a6b4-ba847eb3ad4c/image.png" alt=""></p>
<ul>
<li>함수의 call signature란 위 사진처럼 함수 add에 마우스 커서를 올려보면 보게되는 것을 말함.</li>
<li>인자(argument)의 타입과 함수의 반환 타입을 알려준다.</li>
<li>함수를 어떻게 호출해야 하는지 알려준다.<hr>
## 나만의 call signature 만들기
```ts
type Add = (a: number, b: number) => number;//이게 call signature

</li>
</ul>
<p>const add: Add = (a, b) =&gt; a + b;</p>
<pre><code>변수 add를 선언할 때 타입스크립트에게 타입이 number라고 말해줄 필요가 없다.
- 함수를 구현하기 전에 내가 타입을 만들 수 있고, 함수가 어떻게 작동하는지 서술해둘 수 있다.
- 내가 타입을 생각하도록 해준다.
- 코드를 구현하면서 타입들을 써줘야 했지만 그 과정을 분리해준다.

&lt;hr&gt;

## 주의할 점

위 함수에서..
```ts
type Add = (a: number, b: number) =&gt; number;

const add: Add = (a, b) =&gt; {a + b}; //a+b가 아니라 {}안에 a+b를 쓰면</code></pre><p>{}안의 {a+b}가 함수 내부 내용으로 처리돼서 return값이void가 된다.
즉,</p>
<pre><code class="language-ts">const add: Add = (a, b) =&gt; a + b;</code></pre>
<p>이 화살표 함수는 다음과 같다.</p>
<pre><code class="language-ts">function add(a, b): Add {
  return a + b;
}</code></pre>
<p>그러나 </p>
<pre><code class="language-ts">const add: Add = (a, b) =&gt; {a + b};</code></pre>
<p>이 화살표 함수는 다음과 같다.</p>
<pre><code class="language-ts">function add(a, b) : Add {
  a + b;
}</code></pre>
<ul>
<li>즉,  화살표 함수에서 {}를 사용하면 그 안의 값은 return(반환)이 아니라 함수 내부 내용으로 처리되기에 반환값이 없는 void로 처리된다.</li>
<li>이에 따라 위에서 미리 선언한
type Add = (a: number, b: number) =&gt; number;
의 내용과 충돌하여 error가 발생한다. </li>
<li>number를 return 해야 하는데 return값이 없는 void로 처리되기 때문.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트의 타입#2]]></title>
            <link>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%ED%83%80%EC%9E%852</link>
            <guid>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%ED%83%80%EC%9E%852</guid>
            <pubDate>Tue, 31 Jan 2023 07:11:10 GMT</pubDate>
            <description><![CDATA[<h3 id="1-readonly">1. readonly</h3>
<pre><code class="language-ts">type Player = {
  readonly name: string,
  age?: number
}

const playerMaker = (name: string) :Player =&gt; ({name])

const jaehun = playerMaker(&quot;jaehun&quot;)
jahun.name = &quot;messi&quot; //-&gt; error

const numbers : readonly number[] = [1, 2, 3, 4]
numbers.push(5) // -&gt; 불가능</code></pre>
<blockquote>
<p>readonly를 통해 읽기전용으로 만들 수 있다. 
최초선언 후 수정 불가</p>
</blockquote>
<hr>

<h3 id="2-tuple">2. Tuple</h3>
<pre><code class="language-ts">const player : [string, number, boolean] = [&quot;jaehun&quot;, 2, true]

player[0] = 1 //-&gt;error</code></pre>
<p>Typescript에게 이 array가 최소 3개의 아이템을 가지며 string, number, boolean의 순서대로여야 함을 알려야 할 때 유용하다.</p>
<blockquote>
<p>tuple은 array를 생성할 수 있게 한다. 최소한의 길이를 가져야 하고 특정위치에 특정 타입이 있어야 한다.</p>
</blockquote>
<hr>
3. Undefined

<pre><code class="language-ts">let a : undefined = undefined</code></pre>
<hr>
4. null

<pre><code class="language-ts">let a : null = null</code></pre>
<hr>
5. any

<ul>
<li>아무 타입이나 될 수 있음.</li>
<li>비어있는 값을 쓰면 기본값이 any가 됨.</li>
<li>Typescript의 보호장치로부터 빠져나오고 싶을 때 사용</li>
</ul>
<pre><code class="language-ts">let a = []</code></pre>
<hr>
6. void

<ul>
<li>void란 비어있는 것을 말함.</li>
<li>아무것도 return하지 않는 함수의 반환값을 나타낸다.</li>
<li>함수에 return 문이 없거나 해당 return 문에서 명시적 값을 반환하지 않을 때 항상 유추되는 타입이다.<pre><code class="language-ts">function hello() {
console.log(&quot;hello&quot;);
}</code></pre>
hello함수에 커서를 갖다대면 아무것도 return하지 않는 void라는 것을 알려준다.
Typescript는 그 함수가 아무것도 return하지 않는다는 것을 자동으로 인식한다.때문에 hello() : void 이렇게 쓰지 않아도 된다.</li>
</ul>
<hr>
7. never

<ul>
<li>함수가 절대로 return하지 않을 때 발생한다.</li>
<li>타입이 두가지 일 수도 있는 상황에 발생한다.<pre><code class="language-ts">function hello(name: string | number) {
if(typeof name === &quot;string&quot;) {
  name
  //커서를 올려보면 name은 string
} else if(typeof name === &quot;number&quot;) {
  name
  //name은 number
} else {
  name
  //name은 never
  //뭘쓰던 그 타입은 never
  //이 코드는 절대 실행되지 않아야 한다는 것.
}
}</code></pre>
</li>
</ul>
<hr>
8. unknown

<pre><code class="language-ts">let a : unknown</code></pre>
<ul>
<li>어떤 변수의 타입을 미리 알지 못하는 경우.</li>
<li>어떤 작업을 하려면 이 변수의 타입을 먼저 확인해야 하도록 하는 일종의 보호장치.</li>
</ul>
<pre><code class="language-ts">if(typeof a === &#39;number&#39;) {
  let b = a + 1;
}</code></pre>
<p>위 if구문 안에서는 a의 타입이 number이기 때문에 error없이 코드를 작성할 수 있다.</p>
<pre><code class="language-ts">if(typeof a === &quot;string&quot;) {
  let b = a.toUpperCase();
}</code></pre>
<p>위 if구문 안에서는 a의 타입이 string이기 때문에 error없이 코드를 작성할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트의 타입#1]]></title>
            <link>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%ED%83%80%EC%9E%851</link>
            <guid>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%ED%83%80%EC%9E%851</guid>
            <pubDate>Mon, 30 Jan 2023 07:38:08 GMT</pubDate>
            <description><![CDATA[<h3 id="typescript의-type">Typescript의 type</h3>
<table>
<thead>
<tr>
<th align="center">Type</th>
<th align="center">Description</th>
</tr>
</thead>
<tbody><tr>
<td align="center">boolean</td>
<td align="center">true 와 false</td>
</tr>
<tr>
<td align="center">null</td>
<td align="center">값이 없음을 명시</td>
</tr>
<tr>
<td align="center">undefined</td>
<td align="center">값을 할당하지 않은 변수의 초기값</td>
</tr>
<tr>
<td align="center">number</td>
<td align="center">숫자(정수와 실수, Infinity, NaN)</td>
</tr>
<tr>
<td align="center">string</td>
<td align="center">문자열</td>
</tr>
<tr>
<td align="center">symbol</td>
<td align="center">고유하고 수정 불가능한 데이터 타입이며 주로 객체 프로퍼티들의 식별자로 사용(ES6에서 추가)</td>
</tr>
<tr>
<td align="center">object</td>
<td align="center">객체형(참조형)</td>
</tr>
<tr>
<td align="center">array</td>
<td align="center">배열</td>
</tr>
<tr>
<td align="center">tuple</td>
<td align="center">고정된 요소수만큼의 타입을 미리 선언 후 배열을 표현</td>
</tr>
<tr>
<td align="center">enum</td>
<td align="center">열거형. 숫자값 집합에 이름을 지정한 것이다.</td>
</tr>
<tr>
<td align="center">any</td>
<td align="center">타입 추론(type inference)할 수 없거나 타입 체크가 필요없는 변수에 사용. var 키워드로 선언한 변수와 같이 어떤 타입의 값이라도 할당 가능.</td>
</tr>
<tr>
<td align="center">void</td>
<td align="center">일반적으로 함수에서 반환값이 없을 경우 사용한다.</td>
</tr>
<tr>
<td align="center">never</td>
<td align="center">결코 발생하지 않는 값</td>
</tr>
<tr>
<td align="center">``` javascript</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">const player : {</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">name: string,</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">age: number</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">} = {</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">name: &quot;jaehun&quot;,</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">}</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">```</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">이 경우 player.name과 age의 type을 말해줬지만 정작 age의 값을 적지 않아서 error가 발생한다. 이럴 땐</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">``` javascript</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">const player : {</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">name: string,</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">age?: number</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">} = {</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">name: &quot;jaehun&quot;</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">}</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">```</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">이렇게 age 다음에 ?: 를 붙여주어 age의 type이 number이거나 undefined이 될 수 있게 해준다.</td>
<td align="center"></td>
</tr>
<tr>
<td align="center"><br></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">하지만 이 때</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">``` javascript</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">if(player.age &lt; 10) {</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">}</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">```</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">처럼 player.age를 불러오려 하면 age가 undefined일 수도 있기 때문에 error가 표시된다. 때문에</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">``` js</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">if(player.age &amp;&amp; player.age &lt; 10) {</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">}</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">```</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">처럼 작성해 player.age가 존재하는지 확인을 거치게 만들어줄 수 있다.</td>
<td align="center"></td>
</tr>
<tr>
<td align="center"><hr></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">### Alias(별칭) type</td>
<td align="center"></td>
</tr>
</tbody></table>
<p>player가 여러명인 경우 alias type으로 코드의 양을 줄여준다.</p>
<pre><code class="language-ts">type Player = {
  name: string,
  age?: number
}

const player1 : Player = {
  name: &quot;jaehun&quot;
}

const player2 : Player = {
  name: &quot;messi&quot;
}</code></pre>
<p>또, age의 타입에 대한 다른 Alias를 만들 수도 있다.(예시일 뿐 굳이 이렇게까지 재사용할 필요는 없다.)</p>
<pre><code class="language-ts">type Age = number;
type Name = string;

type Player = {
  name: Name,
  age?: Age
}

const player1 : Player = {
  name: &quot;jaehun&quot;
}

const player2 : Player = {
  name: &quot;messi&quot;
}</code></pre>
<hr>
### 함수에서의 활용

<pre><code class="language-ts">type Age = number;
type Name = string;

type Player = {
  name: Name,
  age?: Age
}

function playerMaker(name: string) : Player {
  //argument의 type 지정
  return {
    name: name
    //return값의 type 지정
}

const jaehun = playerMaker(&quot;jaehun&quot;)
jaehun.age = 26
</code></pre>
<p>위의 내용을 arrow function으로 나타내면</p>
<p>```ts
const playerMaker = (name: string) : Player =&gt; ({name})</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트(Typescript) 입문해보기]]></title>
            <link>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Typescript-%EC%9E%85%EB%AC%B8%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@re_honey/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Typescript-%EC%9E%85%EB%AC%B8%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sun, 29 Jan 2023 17:07:29 GMT</pubDate>
            <description><![CDATA[<h1 id="타입스크립트typescript란">타입스크립트(Typescript)란?</h1>
<ol>
<li>Javascript에 추가적인 구문을 추가하여 editor와의 단단한 통합을 지원하는 strongly typed(강타입) 프로그래밍 언어. editor에서 초기에 오류를 잡을 수 있다.<br></li>
<li>Typescript 코드는 Javascript가 실행되는 모든 곳(브라우저, Node.js, Deno 및 앱 등) 에서 Javascript로 변환될 수 있다.<ul>
<li>변환하는 이유는 브라우저가 Typescript가 아닌 Javascript를 이해하기 때문.</li>
<li>Node.js는 둘 다 이해할 수 있다.<br></li>
</ul>
</li>
<li>Typescript는 Javascript를 이해하고 타입추론(type inference)을 사용하여 추가 코드 없이도 훌륭한 도구를 제공한다. 개발자가 실수하지 않도록 보호해준다.</li>
</ol>
<hr>

<h2 id="typescript의-변환-과정">Typescript의 변환 과정</h2>
<ol>
<li>Typescript코드를 작성</li>
<li>Typescript가 에러를 감지하면 Javascript로 컴파일되지 않음</li>
<li>에러가 없다면 Javascript로 컴파일됨.</li>
</ol>
<p>ex)</p>
<pre><code class="language-javascript">[1, 2, 3, 4] + false</code></pre>
<p>위 와같은 코드는 컴파일 조차 되지 않는다.</p>
<hr>


<h1 id="typescript의-타입-시스템">Typescript의 타입 시스템</h1>
<ol>
<li>Typescript에게 구체적으로 말해주는 방법(explicit)<pre><code class="language-javascript">let b : boolean = &quot;x&quot;</code></pre>
</li>
</ol>
<ul>
<li>변수 b가 boolean타입이어야 한다고 Typescript에게 말해주고 있지만
boolean타입에 string타입을 할당할 수 없기 때문에 error가 뜬다.<pre><code class="language-javascript">let b : boolean = false</code></pre>
</li>
<li>error가 나지 않는다.<br>


</li>
</ul>
<ol start="2">
<li><p>Typescript가 추론하게 하는 방법(implicit)</p>
<pre><code class="language-javascript">let a = &quot;hello&quot;
let c = [1, 2, 3, 4]</code></pre>
<p>라고만 해도 Typescript는 a의 타입이 string이라는 것과 c의 타입이 number array라는 것을 추론해준다.</p>
<br>
>**2번째 방법(implicit)으로 코드를 작성하는게 바람직하다.**
</li>
<li><p>Typescript의 Typechecker에게 타입을 추론하는 것을 허용해주기 위해.</p>
</li>
<li><p>더 쉽고 코드도 짧아져 가독성이 향상됨.</p>
</li>
</ol>
<br>

<pre><code class="language-javascript">let c = []</code></pre>
<p>하지만 위처럼 빈 배열을 선언하는 경우에는 Typescript에게 이 array가 어떤 array라고 명시적으로 말해줘야할 필요가 있다.</p>
<pre><code class="language-javascript">let c : number[] = []</code></pre>
<p>이와 같은 명시적 표현은 Typescript가 타입을 추론하지 못할 경우에만 최소한으로 사용하는게 좋다.</p>
]]></description>
        </item>
    </channel>
</rss>