<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발하는 인사담당자</title>
    <link>https://hjsong96.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 09:18:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발하는 인사담당자</managingEditor>
    <item>
      <title>(Vue) - Computed vs Watch</title>
      <link>https://hjsong96.tistory.com/307</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;vue 공부 중 watch 랑 computed 가 헷갈려서 정리하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;■ computed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 값 계산 후 그 &lt;b&gt;계산값을 사용&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773628115079&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const message = ref('hello')

const reverseMessage = computed(() =&amp;gt; {
  return message.value.split('').reverse().join('')
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거꾸로 글자를 재계산하여 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;■ watch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;b&gt;값을 감지&lt;/b&gt;하고, 값이 변경되었다면 변경 된 후 &lt;b&gt;행동 처리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773628035627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const keyword = ref('')

watch(keyword, (newValue) =&amp;gt; {
  fetch(`/api/search?q=${newValue}`)
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword 값 변화를 감지하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경이 되었다면 api 를 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;■ 글자 reverse computed 가 적절한 이유&lt;/p&gt;
&lt;pre id=&quot;code_1773628219053&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const message = ref('hello')
const reverseMessage = ref('')

watch(message, (newValue) =&amp;gt; {
  reverseMessage.value = newValue.split('').reverse().join('')
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 watch 로도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이렇게 되면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1509&quot; data-start=&quot;1501&quot; data-section-id=&quot;w2suos&quot;&gt;코드 길어짐&lt;/li&gt;
&lt;li data-end=&quot;1523&quot; data-start=&quot;1510&quot; data-section-id=&quot;kvqkif&quot;&gt;상태 2개 관리해야함&lt;/li&gt;
&lt;li data-end=&quot;1532&quot; data-start=&quot;1524&quot; data-section-id=&quot;adfs8w&quot;&gt;실수 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 값을 계산해서 사용할 때는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;computed&lt;span&gt; 가 적절하다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;■ vuex computed 사용 이유&lt;/p&gt;
&lt;pre id=&quot;code_1773628355249&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const store = useStore();

const getChatData = computed(() =&amp;gt; store.getters['chat/getChatData']); //챗 데이터 vuex&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const store = useStore();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;는 Vuex store 인스턴스 가져오는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;store.state &lt;br /&gt;store.getters &lt;br /&gt;store.commit &lt;br /&gt;store.dispatch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챗데이터 vuex 는 Vuex getter &amp;rarr; chat/getChatData 값을 가져온다 는 의미로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vuex model 은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1773628606927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// store/modules/chat.js

const getters = {
  getChatData: (state) =&amp;gt; state.chatData
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;computed 로 감싸는 이유는 store 변경 &amp;rarr; computed 재계산 &amp;rarr; UI 갱신 하기 위해서이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Vue에서는 &lt;b&gt;Vuex 값은 대부분 computed로 가져온다고 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref 대신 computed 를 사용하는 이유가 궁금했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref 는 store 값 &amp;rarr; 한번 복사해서 ref에 넣는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;ref 는 단순값 저장이기 때문에 computed 와는 다르게 store 값이 바뀌어도 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;chatData 는 변경되지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/Vue</category>
      <category>computed</category>
      <category>Ref</category>
      <category>vue</category>
      <category>watch</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/307</guid>
      <comments>https://hjsong96.tistory.com/307#entry307comment</comments>
      <pubDate>Mon, 16 Mar 2026 13:04:01 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 타입 변수 응용하기</title>
      <link>https://hjsong96.tistory.com/306</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;■ 타입 변수 응용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;function swap&amp;lt;T, U&amp;gt;(a: T, b: U) {
    return [b, a];
}

const [a, b] = swap('string', 2);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 a: T, b; U 와 같이 타입 변수를 여러 개 선언해서 사용하는 것도 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;function returnFirstValue&amp;lt;T&amp;gt;(data: T) {
    return data[0];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 제네릭을 사용해서 받게 되면 unknown 형식에서 사용할 수 없다는 오류가 뜬다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면 아직 &lt;b&gt;해당 함수 호출 전까지는 해당 인수의 값이 추론 되지 않기 때문&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 데이터가 배열이라는 확신도 없을 뿐더라 호출이 되지 않았기 때문에 unknown 인 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;function returnFirstValue&amp;lt;T&amp;gt;(data: T[]) {
    return data[0];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그럴 경우 data 의 값을 T[] 로 바꿔주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;T의 값은 어떤 것인지는 모르지만 unknown 배열 타입이기 때문에 오류가 사라진다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;let str = returnFirstValue([1, 'hello', 'mynameis']);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 지정을 하게 되면 str 는 number | string 유니온 타입으로 나온다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;function returnFirstValue&amp;lt;T&amp;gt;(data: [T, ...unknown[]]) {
    return data[0];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 여기서 만약 data[0] 가 number 값이 나오기를 원한다면 튜플 타입으로 지정해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우선 [] 로 튜플로 만들어주고, 첫 번째 요소를 타입 변수로 넣어준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음 요소는 우리가 알 필요가 없기 때문에 rest 파라미터 쓰듯이 ...unknown[] 배열로 넣어주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;function getLength&amp;lt;T extends { length: number }&amp;gt;(data: T) {
    return data.length;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;let var1 = getLength([1, 2, 3]);
let var2 = getLength('12345');
let var3 = getLength({ length: 10 }); //10
let var4 = getLength(10); //불가능!&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래 예시처럼 여러 개의 타입에서 길이를 구하고 싶다고 해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우선은 data: T 를 통해 DATA 가 어떤 타입이 오든지 다 받는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 data.length 에 오류가 생기는데, 숫자 타입이 아닌 경우 length 함수를 쓰지 못해서 그렇다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그럴 경우 우리가 반환 타입을 length:number 로 extends(확장) 해서 받으면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;interface InterfaceA {
    length: number;
}

interface InterfaceB extends InterfaceA {}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이해를 돕기 위해 말하자면, 이전에 인터페이스를 했을 때도 InterfaceB 는&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;InterfaceA 확장 받아서 반드시 length: number 를 포함해야 했다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;마찬가지로 위의 코드도 length가 number 인 것으로 타입을 확장해서 받으면 길이가 숫자에 해당하는 것만 구하게 되는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 배열도 length 를 가지고 있기 때문에 허용이 되고, 문자도 , 객체는 length 프로퍼티가 있기 때문에 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;getLength(10)은 number 타입으로 length 프로퍼티가 없기 때문에 정상적으로 오류 처리가 된다.&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>typeScript</category>
      <category>TypeScript 타입 변수 응용</category>
      <category>이정환</category>
      <category>제네릭</category>
      <category>제네릭 설정</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/306</guid>
      <comments>https://hjsong96.tistory.com/306#entry306comment</comments>
      <pubDate>Tue, 26 Aug 2025 15:59:10 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 제네릭</title>
      <link>https://hjsong96.tistory.com/305</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 제네릭 (일반적인, 포괄적인)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;: 모든 타입에 두루 두루 쓸 수 있는 범용적 함수이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;//제네릭 함수
function func&amp;lt;T&amp;gt;(value: T): T {
    return value;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;T&amp;gt; 모양을 사용하면 되는데 여기서 &lt;b&gt;T 는 타입을 저장하는 변수, 즉 타입 변수&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 나서 매개변수와 반환값도 T 로 바꿔준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;let num = func(10); //number

let bool = func(true); //boolean

let str = func('string'); //string&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 각각의 변수가 우리가 원하는 값으로 추론 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;함수를 호출할 때마다 타입이 담기게 되어 그때 그때마다 타입을 지정할 수 있는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 정리&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;타입변수와 함께 &lt;b&gt;여러 타입의 값을 인수로 받아서 범용적으로 쓸 수 있는 함수를 제네릭 함수&lt;/b&gt;라고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;제네릭 함수는 타입 변수를 꺽쇠와 함께 함수 이름 뒤에 선언하고,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 타입 변수에 할당되는 타입은 함수 호출할 때 인수에 따라서 결정된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, func(10) 에서는 인수가 10 이여서 number 로 타입이 지정된 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;* 명시적 타입 지정&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;let arr = func&amp;lt;[number, number, number]&amp;gt;([1, 2, 3]);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;타입을 명시적으로 지정해주고 싶으면 타입을 정해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;해당 예시는 넘버 배열 함수를 튜플 함수로 지정하는 방법이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>typeScript</category>
      <category>TypeScript 제네릭</category>
      <category>이정환</category>
      <category>제네릭</category>
      <category>타입스크립트</category>
      <category>타입스크립트 제네릭</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/305</guid>
      <comments>https://hjsong96.tistory.com/305#entry305comment</comments>
      <pubDate>Tue, 26 Aug 2025 15:05:06 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 인터페이스와 클래스</title>
      <link>https://hjsong96.tistory.com/304</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 인터페이스와 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface CharacterInterface {
    name: string;
    moveSpeed: number;
    move(): void;
}

class Character implements CharacterInterface {
    name: string;
    moveSpeed: number;

    constructor(name: string, moveSpeed: number) {
        this.name = name;
        this.moveSpeed = moveSpeed;
    }

    move(): void {
        console.log(`${this.moveSpeed} 속도로 움직입니다.`);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;implement (구현) 이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 여기서 캐릭터 인터페이스는 설계도 역할을 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 캐릭터라는 클래스가 실제로 캐릭터 인터페이스를 구현하는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface CharacterInterface {
    name: string;
    moveSpeed: number;
    move(): void;
}

class Character implements CharacterInterface {
    constructor(public name: string, public moveSpeed: number) {}

    move(): void {
        console.log(`${this.moveSpeed} 속도로 움직입니다.`);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 접근제어자를 생성자에 넣어 깔끔하게 코드를 정리할 수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VM72K/btsP7gkjeGe/9So4cevj39PYlo3Ien73X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VM72K/btsP7gkjeGe/9So4cevj39PYlo3Ien73X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VM72K/btsP7gkjeGe/9So4cevj39PYlo3Ien73X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVM72K%2FbtsP7gkjeGe%2F9So4cevj39PYlo3Ien73X1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;46&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 인터페이스의 접근제어자는 무조건 public 이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 생성자에 public 이외의 접근제어자를 넣었을 경우 오류가 발생한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lLSSr/btsP5hka8IC/ACo1J7pULOMrmB0YmZ0260/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lLSSr/btsP5hka8IC/ACo1J7pULOMrmB0YmZ0260/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lLSSr/btsP5hka8IC/ACo1J7pULOMrmB0YmZ0260/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlLSSr%2FbtsP5hka8IC%2FACo1J7pULOMrmB0YmZ0260%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;41&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 다른 접근제어자가 필요하는 프로퍼티가 잇을 경우에는 별도로 생성자에 정의해서 넣어주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>typeScript</category>
      <category>TypeScript 인터페이스</category>
      <category>이정환</category>
      <category>타입스크립트</category>
      <category>타입스크립트 인터페이스</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/304</guid>
      <comments>https://hjsong96.tistory.com/304#entry304comment</comments>
      <pubDate>Tue, 26 Aug 2025 11:46:10 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 접근 제어자</title>
      <link>https://hjsong96.tistory.com/303</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 접근 제어자 (access modifier)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;: 타입스크립트 클래스에서만 제공하며, &lt;b&gt;특정 클래스를 만들 때 특정 필드나 메서드에 접근할 수 있는 범위를 설정&lt;/b&gt;해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ex) public / private / protected&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;const employee = new Employee('송송', 27, 'developer');
employee.name = '히히';
employee.age = 17;
employee.position = 'designer';&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;인스턴스를 생성하고 값을 세팅할 수 있는 이유는 기본적으로 클래스의 접근제어자가 public 으로 설정돼&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아무 제약 없이 누구나 접근이 가능하기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HNX0q/btsP68zOV3U/wIHu8a0rteMHm5S9KNqkXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HNX0q/btsP68zOV3U/wIHu8a0rteMHm5S9KNqkXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HNX0q/btsP68zOV3U/wIHu8a0rteMHm5S9KNqkXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHNX0q%2FbtsP68zOV3U%2FwIHu8a0rteMHm5S9KNqkXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;90&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 접근 프로퍼티를 private 으로 바꾸면&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;해당 클래스 내에서만 엑세스 할 수 있게 바뀐다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 클래스 밖에서는 점표기법으로 접근도 읽을 수도 없게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;    //메서드
    work() {
        console.log(`${this.name} working`);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 접근을 원한다면, 클래스 내부의 메서드를 통해서만 접근이 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class ExecutiveOfficer extends Employee {
    // 필드
    officeNumber: number;

    constructor(name: string, age: number, position: string, officeNumber: number) {
        super(name, age, position);
        this.officeNumber = officeNumber;
    }

    //메서드
    func() {
        console.log(`${this.name} working`); //파생클래스에선는 접근 불가!
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;private 은 해당클래스에서만 접근이 가능하므로 아무리 파생클래스여도 접근이 불가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;    protected age: number;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;    //메서드
    func() {
        console.log(`${this.age}`);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;외부에서는 접근을 막지만 파생클래스에는 접근을 허용하고 싶을 때 사용하는 것이 바로 protected&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;protected 를 사용하면 private 와는 다르게 파생클래스에서는 사용이 가능하게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class Employee {
    //필드 (&amp;lt;-생성자 접근제어자 작성 시 해당 부분 제거 필요!)
    private name: string;
    protected age: number;
    position: string;

    constructor(private name: string, protected age: number, public position: string) { //값 초기화도 자동으로 해줌
        this.name = name;
        this.age = age;
        this.position = position;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;생성자에 접근제어자를 달아줄 수 있는데,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그렇게 되면 생성자가 알아서 필드를 생성하므로 기존에 정의했던 필드를 지워줘야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;더불어 생성자에 접근제어자 작성 시, 초기화도 알아서 해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 하단에 this.name = name 을 별도로 적어주지 않아도 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;클래스로 만든 객체의 프로퍼티를 함부로 외부에서 수정할 수 없도록 해야한다. (=정보의 은닉화)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이를 접근제어자를 통해 할 수 있는 것이다.&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>private</category>
      <category>Protected</category>
      <category>Public</category>
      <category>typeScript</category>
      <category>TypeScript 접근제어자</category>
      <category>TypeScript 클래스</category>
      <category>이정환</category>
      <category>접근제어자</category>
      <category>정보의 은닉화</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/303</guid>
      <comments>https://hjsong96.tistory.com/303#entry303comment</comments>
      <pubDate>Tue, 26 Aug 2025 11:27:42 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 타입스크립트 클래스</title>
      <link>https://hjsong96.tistory.com/302</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 타입스크립트 클래스 사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Employee {
    //필드
    name: string;
    age: number;
    position: string;

    constructor(name: string, age: number, position: string) {
        this.name = name;
        this.age = age;
        this.position = position;
    }

    //메서드
    work() {
        console.log('working');
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트 클래스 생성에는 필드에 타입을 지정해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 타입 지정에서 끝나는 것이 아니라 초기값과 할당이 되지 않아 오류가 난다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 생성자를 만들어서 값을 할당해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메서드는 동일하게 넣어주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Ei7g/btsP7l6Wv9N/Z5D177qEyIvLokZFJbRIp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Ei7g/btsP7l6Wv9N/Z5D177qEyIvLokZFJbRIp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Ei7g/btsP7l6Wv9N/Z5D177qEyIvLokZFJbRIp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Ei7g%2FbtsP7l6Wv9N%2FZ5D177qEyIvLokZFJbRIp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;80&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트에서 클래스는 자바스크립트이면서 동시에 타입으로도 취급된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 employee 변수가 Employee 타입으로 인식된 것을 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const employeeC: Employee = {
    name: '',
    age: 0,
    position: '',
    work() {},
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;타입 지정을 해주면 다음과 같이 해당 클래스에서 요구했던 프로퍼티를 넣어주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class ExecutiveOfficer extends Employee {
    // 필드
    officeNumber: number;

    constructor(name: string, age: number, position: string, officeNumber: number) {
        super(name, age, position);
        this.officeNumber = officeNumber;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 세부적인 클래스를 만들고 상속 받을수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;※ any 허용 config 설정 처리&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&quot;noImplicitAny&quot;: false&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;noImplicitAny : 암시적 애니 허용하지 않을 것이냐? -&amp;gt; false (허용) -&amp;gt; 타입스크립트 타입 설정 안해도 오류 안뜸&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그러나 해당 설정 사항은 비권장&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>noImplicitAny</category>
      <category>typeScript</category>
      <category>TypeScript Class</category>
      <category>이정환</category>
      <category>타입스크립트 클래스</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/302</guid>
      <comments>https://hjsong96.tistory.com/302#entry302comment</comments>
      <pubDate>Tue, 26 Aug 2025 10:32:07 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 자바스크립트 클래스</title>
      <link>https://hjsong96.tistory.com/301</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 자바스크립트 클래스 사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;compilerOptions&quot;: {
        &quot;target&quot;: &quot;ESNext&quot;,
        &quot;module&quot;: &quot;ESNext&quot;,
        &quot;skipLibCheck&quot;: true,
        &quot;outDir&quot;: &quot;dist&quot;,
        &quot;strict&quot;: true,
        &quot;moduleDetection&quot;: &quot;force&quot;,
        &quot;allowJs&quot;: true
    },

    &quot;include&quot;: [&quot;src&quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트에서 자바스크립트를 사용하고자 한다면&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;allowJs : true 설정을 하면 include 안에 있는 src 에서 JavaScript 도 허용한다는 뜻이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;필드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Student {
    // 필드 : 클래스가 만들어낼 객체의 프로퍼티
    name;
    grade;
    age;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;클래스는 붕어빵 틀, 객체는 붕어빵이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;클래스에서 필드는 &lt;b&gt;클래스가 만들어낼 객체의 프로퍼티&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;생성자&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;: 클래스 호출 시 &lt;b&gt;실제로 객체를 만들어 내는 역할을 하는 메서드&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;    //생성자 : 클래스 호출 시 실제로 객체를 만들어내는 역할(=메서드)
    constructor(name, grade, age) {
        this.name = name
        this.grade = grade
        this.age = age
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;매개변수로 받은 값들을 실제 만들 객체의 프로퍼티 값으로 설정해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ceylon&quot;&gt;&lt;code&gt;let studentB = new Student('이이', 5, 17);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;객체 생성하기 위해서는 &lt;b&gt;new 클래스 이름(매개변수) &lt;/b&gt;형식으로 만들어준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;클래스의 생성자가 호출되면 인수들이 매개변수로 전달되는데,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;this.name 객체의 프로퍼티에 전달된 매개변수가 저장된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게&lt;b&gt; 클래스를 통해 만들어진 객체를 인스턴스 &lt;/b&gt;라 부르고,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서는 Student 객체를 통해 만들어진 객체이므로 Student 인스턴스라 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스에 메서드 만들기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;class Student {
    // 필드 : 클래스가 만들어낼 객체의 프로퍼티
    name;
    grade;
    age;

    //생성자 : 클래스 호출 시 실제로 객체를 만들어내는 역할(=메서드)
    constructor(name, grade, age) {
        this.name = name;
        this.grade = grade;
        this.age = age;
    }

    // 메서드
    study() {
        console.log('공부');
    }
    introduce() {
        console.log('안녕');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메서드도 간단하게 클래스 안에 우리가 넣어줄 메서드를 넣어주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;studentB.study();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 이렇게 메서드도 인스턴스를 통해 호출이 가능한 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;    // 메서드
    study() {
        console.log('공부');
    }
    introduce() {
        console.log(`안녕 ${this.name}`);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;this 는 현재 객체를 나타내므로 객체를 통해서 생성된 인스턴스의 this 를 호출하면 해당 이름 호출도 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;상속 이용하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class StudentDeveloper extends Student {
    //필드
    favoriteSkill;

    //생성자
    constructor(name, grade, age, favoriteSkill) {
        super(name, grade, age);
        this.favoriteSkill = favoriteSkill;
    }

    programming() {
        console.log(`${this.favoriteSkill}로 프로그래밍 함`);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;extends 를 사용하면 부모 클래스의 필드와 메서드를 그대로 사용 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;super 함수 호출하면 부모 클래스의 생성자가 호출돼서&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우리가 전달받은 매개변수가 부모 클래스의 생성자 메서드에서 호출돼서 세팅이 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 우리는 그대로 값 세팅이 가능한 것이다.&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>allowJs</category>
      <category>JavaScript</category>
      <category>typeScript</category>
      <category>이정환</category>
      <category>자바스크립트</category>
      <category>타입스크립트에서 자바스크립트 사용하기</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/301</guid>
      <comments>https://hjsong96.tistory.com/301#entry301comment</comments>
      <pubDate>Mon, 25 Aug 2025 14:27:42 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 인터페이스 선언 합치기</title>
      <link>https://hjsong96.tistory.com/300</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;■ 인터페이스 선언 합치기 (declaration merging)&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;interface Person {
    name: string
}

interface Person {
    age: number
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스는 타입과는 다르게 동일한 이름으로 두 개의 인터페이스를 선언해도 문제가 되지 않는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동일한 이름으로 정의한 인터페이스들이 결국 합쳐지고, 이를 선언 합침&lt;/b&gt;이라 한다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const person: Person = {
    name: '',
    age: 13,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 인터페이스를 따라 만든 객체도 2개의 프로퍼티를 가지게 되는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;interface Person {
    name: string;
}

interface Person {
    name: number; //충돌!
    age: number;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;동일한 프로퍼티를 재정의하는데 타입을 달리하면 충돌이 일어나 오류가 발생한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Person {
    name: string;
}

interface Person {
    name: 'string'; // 스트링 리터럴 불가! string 만 가능
    age: number;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;선언 합침에서는 이전 인터페이스 확장과 다르게 재정의할때 타입이 일치해야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모듈 보강 (예시)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;interface Lib {
    a: number;
    b: number;
}

const lib: Lib = {
    a: 1,
    b: 2,
    c: 3,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이런 선언 합침은 보통 모듈을 보강할 때 많이 사용한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음 코드에서처럼 라이브러리에 새로운 프로퍼티 추가가 필요한 경우 보통 라이브러리 자체에 추가가 어렵다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 선언 합침을 통해 다시 재정의 해줌으로써 우리가 필요한 c 프로퍼티를 넣을 수 있다.&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>typeScript</category>
      <category>TypeScript 선언 합치기</category>
      <category>선언 합치기</category>
      <category>이정환</category>
      <category>타입스크립트 선언 합치기</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/300</guid>
      <comments>https://hjsong96.tistory.com/300#entry300comment</comments>
      <pubDate>Mon, 25 Aug 2025 11:46:03 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 인터페이스 확장</title>
      <link>https://hjsong96.tistory.com/299</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 인터페이스 확장&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xl&quot;&gt;&lt;code&gt;interface Animal {
    name: string;
    color: string;
}

const dog:Dog = {
    name: '',
    color: '',
    isBark: true,
};

const cat:Cat {
    name: '',
    color: '',
    isScratch: boolean,
}

const chicken:Chicken {
    name: '',
    color: '',
    isFly: boolean,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 서브타입을 정의할 때 중복된 프로퍼티가 많은 것을 확인 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이를 해결할 수 있는 게 인터페이스 확장 기능이다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Dog extends Animal {
    isBark: boolean;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;extends(=확장하다) 를 통해 Animal 받아준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;기존의 Animal 이 가진 모든 프로퍼티를 가질 수 있는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이를 상속이라고도 하는데 &lt;b&gt;부모 타입으로부터 자식 타입이 물려받는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Dog extends Animal {
    isBark: boolean;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 상속 받은 인터페이스에서 다시&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;name: 'hello' 와 같이 스트링 리터럴 타입 프로퍼티를 재정의 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 무조건 다시 재정의 가능한 건 아니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다시 정의하려고 하는 타입이 원본 타입의 서브 타입이여만 가능&lt;/b&gt;하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서도 name 원본 타입이 string 이고,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;서브타입이 스트링 리터럴 타입이여서 이렇게 재정의가 가능하다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type Animal = {
    name: string;
    color: string;
}

interface Dog extends Animal {
    isBark: boolean;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;또 만약 Animal 이 type 별칭이였다고 해도 확장할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스는 객체 타입이면 다 확장 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;다중확장&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface DogCat extends Dog, Cat {}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const dogCat: DogCat = {
    name: '',
    color: '',
    isBark: true,
    isScratch: false,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Dog 와 Cat 둘 다 확장하도록 받을 수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 되면 Dog 와 Cat 이 가진 모든 프로퍼티를 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/TypeScript</category>
      <category>extends</category>
      <category>typeScript</category>
      <category>TypeScript 다중확장</category>
      <category>TypeScript 상속</category>
      <category>TypeScript 인터페이스</category>
      <category>TypeScript 인터페이스 확장</category>
      <category>이정환</category>
      <category>타입스크립트</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/299</guid>
      <comments>https://hjsong96.tistory.com/299#entry299comment</comments>
      <pubDate>Mon, 25 Aug 2025 11:33:05 +0900</pubDate>
    </item>
    <item>
      <title>(TypeScript) - 인터페이스</title>
      <link>https://hjsong96.tistory.com/298</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;■ 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;: 상호간에 약속된 규칙&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;객체 구조 정의하는데 특화된 문법 (상속, 합침 등)&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface Person {
    readonly name: string;
    age?: number;
    sayHi: () =&amp;gt; void;
}

const person: Person = {
    name: '송송송',
    sayHi: function () {
        console.log('hi');
    },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스는 타입별칭과 타입 정의하는 것은 비슷하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;? 를 사용하여 선택적 프로퍼티도 받을 수 있으며,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;함수형으로 sayHi: () =&amp;gt; void; 처럼 화살표 함수로 받거나&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;또는 sayHi(): void; 처럼 호출 시그니처로 받을 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스로 받을때는 기본적인 호출 시그니처와 다르게 메서드 이름이 sayHi() 처럼 변수 앞에 붙는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 왜 다를까?&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;type Func = {
    (): void;
};

const func: Func = () =&amp;gt; {
    console.log('func');
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이전에 우리가 배운 호출 시그니처는 다음과 같이&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;함수 매개변수와 반환값을 정해주는 말 그대로 함수 타입을 정의하는 타입이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉 () 매개변수 아무것도 안받고, 반환값이 void 아무것도 반환하지 않은 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Person {
    readonly name: string;
    age?: number;
    (): void;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const person: Person = {
    name: '송송송',
    sayHi: function () {
        console.log('hi');
    },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;근데 만약 여기 코드를 ():void 로 받아서 호출 시그니처 처럼 () 만 사용하면&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 Person 자체가 함수값을 정의하는 것이 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 해당 person은 함수가 아니라 오류가 난다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 인터페이스 프로퍼티를 정의할 때는 앞에 함수에 해당하는 변수명을 적어주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;person.sayHi();
person.sayHi(1, 2);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;    sayHi(): void;
    sayHi(a:number, b:number): void;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 인터페이스에 오버로드 프로퍼티 설정을 위해서는&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;함수 타입 표현식이 아니라 호출 시그니처를 사용해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;함수 타입 표현식은 두 개의 프로퍼티 작성하면 동일 변수명으로 오류가 뜨기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type Type1 = number | string;
type Type2 = number &amp;amp; string&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-pm-slice=&quot;1 1 []&quot;&gt;&lt;code&gt;const person: Person | number = {
    name: '송송송',
    sayHi: function () {
        console.log('hi');
    },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스는 기존 객체 정의와는 다르게&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;유니온 타입(합집합)과 인터섹션(교집합)이 불가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 type 으로 유니온, 인터섹션을 이용하거나&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Person | number 와 같이 인터페이스 말고 타입 자체를 유니온 또는 인터섹션 타입으로 받아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;※ 참고&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스를 정할 때 변수명에 I를 붙이는 경우도 종종 있다. = 헝가리안 표기법 (팀 표기법을 따르는 걸 추천!)&lt;/li&gt;
&lt;li&gt;JavaScript 는 _ 를 쓰는 스네이크 표기법이나, &lt;br /&gt;userName 과 같은 카멜 표기법, &lt;br /&gt;UserName 모두 대문자 표시인 파스칼 표기법을 한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/TypeScript</category>
      <author>개발하는 인사담당자</author>
      <guid isPermaLink="true">https://hjsong96.tistory.com/298</guid>
      <comments>https://hjsong96.tistory.com/298#entry298comment</comments>
      <pubDate>Mon, 25 Aug 2025 10:59:09 +0900</pubDate>
    </item>
  </channel>
</rss>