๐Ÿงฉ 02. Interface vs Type: ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ์ดํ„ฐ ์„ค๊ณ„์˜ ๋”œ๋ ˆ๋งˆ

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

๊ฐ์ฒด ํ™•์žฅ์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹: Declaration Merging๊ณผ Intersection์˜ ์ฐจ์ด์  ์™„๋ฒฝ ๋น„๊ต

๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 10๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 6๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
[๋ฌด์—‡์ด ๊ฐ™๊ณ  ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€?] โ†’ [ํ™•์žฅ(extends) vs ๊ต์ฐจ(&)์˜ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด] โ†’ [์‹ค๋ฌด ๊ฐ€์ด๋“œ๋ผ์ธ (์–ด๋–จ ๋•Œ ๋ญ˜ ์“ฐ์ง€?)]

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • interface์™€ type์˜ ๊ณตํ†ต์ ๊ณผ ํ•ต์‹ฌ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ์  ํ™•์žฅ๊ณผ ํ•จ์ˆ˜ํ˜• ๊ต์ฐจ์˜ ์ฐจ์ด๋ฅผ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋งž๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์ฒ˜๋Ÿผ ๋ฐฑ์—”๋“œ API๊ฐ€ ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ์„ค๊ณ„๊ฐ€ ์œ ๋ฆฌํ•œ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜! ํŒ€์›๋“ค๋งˆ๋‹ค API ์‘๋‹ต๊ฐ’ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์š”. ๋ˆ„๊ตฌ๋Š” interface๋ฅผ ์“ฐ๊ณ , ๋ˆ„๊ตฌ๋Š” type์„ ์“ฐ๋Š”๋ฐ, ๋ฆฌ๋ทฐํ•  ๋•Œ๋งˆ๋‹ค '์ด๊ฑฐ ํ†ต์ผํ•ฉ์‹œ๋‹ค'๋ผ๊ณ  ํ•˜๋ ค๋‹ˆ ์ œ๊ฐ€ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์ด ์—†์–ด์„œ ๋ง๋ฌธ์ด ๋ง‰ํž™๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ฐ์ฒด ๋งŒ๋“œ๋Š” ๊ฑฐ ๋˜‘๊ฐ™์ง€ ์•Š๋‚˜์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ, ๊นŠ์€ ๊ณณ์˜ ์ฒ ํ•™์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” '๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ผˆ๋Œ€'๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์‚ฐ๋ฌผ์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” '๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ˆ˜ํ•™์  ์ง‘ํ•ฉ'์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๊ทธ ๋ฏธ๋ฌ˜ํ•œ ์„ ์„ ๊ทธ์–ด๋ณด์ฃ ."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€: '์„ค๊ณ„'์˜ ์ถœ๋ฐœ์„ 

interface์™€ type ๋…ผ์Ÿ์€ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์—์„œ ํƒญ(Tab) vs ์ŠคํŽ˜์ด์Šค(Space)๋งŒํผ ํ”ํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

์ตœ๊ทผ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ด ๋‘˜์˜ ๊ฒฉ์ฐจ๋ฅผ ๋งŽ์ด ์ค„์—ฌ๋†“์•„์„œ, ์‚ฌ์‹ค ์‹ค๋ฌด์—์„œ๋Š” 80% ์ด์ƒ ํ˜ผ์šฉํ•ด์„œ ์จ๋„ ๋‹น์žฅ์˜ ๋ฒ„๊ทธ๋Š” ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‚ด ์ฝ”๋“œ๋กœ ํƒ€์ž… ํ™•์žฅ์„ ์‹œ๋„ํ•˜๋Š” ์ˆœ๊ฐ„, ์ด ๋‘˜์˜ ์„ค๊ณ„์  ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋ฒฝ์— ๋ถ€๋”ชํž™๋‹ˆ๋‹ค.

5๋…„ ์ฐจ ์ด์ƒ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ ˆ๋ฒจ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํ•œ '๊ธฐ๋Šฅ ๊ตฌํ˜„'์„ ๋„˜์–ด, ๋™๋ฃŒ๋“ค์ด ํ™•์žฅํ•˜๊ธฐ ํŽธํ•˜๊ณ  ์ผ๊ด€๋œ ํƒ€์ž… ์„ค๊ณ„ ๊ธฐ์ค€์„ ์„ธ์šธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽญ 1. ๊ณตํ†ต์ : ๋‘˜ ๋‹ค ์˜ค๋ฆฌ(Duck)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

์•ž์„  1๊ฐ•์—์„œ ๋ฐฐ์šด **๊ตฌ์กฐ์  ํƒ€์ดํ•‘(Duck Typing)**์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด, ๋‘ ๋ฐฉ์‹์€ ์™„๋ฒฝํžˆ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : "๋ณด์„ธ์š”! ๋‘˜ ๋‹ค ์™„์ „ํžˆ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•˜์ž–์•„์š”!"
 
// 1. Interface ๋ฐฉ์‹
interface UserInterface {
  id: number;
  nickname: string;
}
 
// 2. Type Alias ๋ฐฉ์‹
type UserType = {
  id: number;
  nickname: string;
};
 
const userA: UserInterface = { id: 1, nickname: "์˜ํ˜ธ" };
const userB: UserType = { id: 2, nickname: "์˜์ˆ˜" };
 
// ๊ตฌ์กฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ํ˜ธํ™˜๋œ๋‹ค!
const test: UserType = userA; // โœ… ํ†ต๊ณผ

์‹ฌ์ง€์–ด ์„œ๋กœ๋ฅผ ์ƒ์†(ํ™•์žฅ)ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (Interface๊ฐ€ Type์„ extendsํ•  ์ˆ˜ ์žˆ๊ณ , Type์ด Interface์™€ & ๊ต์ฐจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๋ณด๋ฉด "์•„๋ฌด๊ฑฐ๋‚˜ ์“ฐ๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋ƒ?"๋ผ๋Š” ์˜์ฒ ์ด์˜ ๋ง์ด ๋งž์•„ ๋ณด์ž…๋‹ˆ๋‹ค.


โšก 2. ๊ฒฐ์ •์  ์ฐจ์ด 1: ํ™•์žฅ ๋ฐฉ์‹ (Extends vs Intersection)

๊ฐ€์žฅ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋งŒ๋‚˜๋Š” ์ฐจ์ด์ ์€ ๊ธฐ์กด ํƒ€์ž…์„ ํ™•์žฅ(์ƒ์†)ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๐Ÿฆ ์˜ํ˜ธ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„: Interface์˜ ์ƒ์† (extends)

๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ผˆ๋Œ€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์‚ด์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

interface BaseComment {
  id: string;
  content: string;
}
 
// ๊ธฐ์กด ๋Œ“๊ธ€์— ์ข‹์•„์š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค
interface LikedComment extends BaseComment {
  likeCount: number;
}

ํŠน์ง•:

  1. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ, ์ตœ์ข… ์ด๋ฆ„์ธ LikedComment๋กœ ๊น”๋”ํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  2. ์ปดํŒŒ์ผ ์†๋„๊ฐ€ (๋ฏธ์„ธํ•˜์ง€๋งŒ) ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. TS๊ฐ€ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ํ•ฉ์น˜๋Š” ๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  3. ์†์„ฑ ์ด๋ฆ„์ด ์ถฉ๋Œํ•  ๋•Œ, ๋ถ€๋ชจ์™€ ์ž์‹ ๊ฐ„์— ์—„๊ฒฉํ•œ ์—๋Ÿฌ๋ฅผ ๋ฟœ์–ด๋‚ด์–ด ์‹ค์ˆ˜๋ฅผ ๋ง‰์•„์ค๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์˜ ์กฐํ•ฉ ๋ฐฉ์‹: Type์˜ ๊ต์ฐจ (& Intersection)

ํ•จ์ˆ˜ํ˜•์ด๊ณ  ์ˆ˜ํ•™์ ์ธ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜๋กœ ๋ญ‰์ณ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

type BasePost = {
  id: string;
  title: string;
};
 
// ๊ธฐ์กด ๊ฒŒ์‹œ๊ธ€ ํƒ€์ž…๊ณผ ์ƒˆ๋กœ์šด ์ข‹์•„์š” ํƒ€์ž…์„ '๊ต์ง‘ํ•ฉ'์œผ๋กœ ๋ฌถ์Œ
type LikedPost = BasePost & {
  likeCount: number;
};

ํŠน์ง•:

  1. ์ด๋ฆ„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์—๋Ÿฌ๋ฅผ ๋ฟœ์ง€ ์•Š๊ณ , ์–ต์ง€๋กœ never ํƒ€์ž…(์กด์žฌํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…)์„ ๋งŒ๋“ค์–ด ๋ฒ„๋ ค ๋‚˜์ค‘์— ์›์ธ์„ ์ฐพ๊ธฐ ํž˜๋“  ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์—๋Ÿฌ ํˆดํŒ์—์„œ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ { id: string, title: string } & { likeCount: number } ์ฒ˜๋Ÿผ ํ’€์–ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”“ 3. ๊ฒฐ์ •์  ์ฐจ์ด 2: ์„ ์–ธ ๋ณ‘ํ•ฉ (Declaration Merging)

๊ฐ€์žฅ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. ์˜์ฒ ์ด๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ‘๋งˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

๐Ÿ”“ Interface: ์—ด๋ ค์žˆ๋Š” ๋ฌธ (Open)

๊ฐ™์€ ์ด๋ฆ„์˜ interface๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ ์–ธํ•˜๋ฉด, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•Œ์•„์„œ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค(Merge).

// ๐Ÿฆ ์˜ํ˜ธ: "์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Window ๊ฐ์ฒด ๋“ฑ)์— ๋‚ด๊ฐ€ ๋งŒ๋“  ์†์„ฑ์„ ๋ผ์›Œ๋„ฃ์„ ๋•Œ ์ตœ๊ณ ์ฃ ."
 
// 1. ์ฒซ ๋ฒˆ์งธ ์„ ์–ธ
interface UserProfile {
  id: number;
}
 
// 2. ๋‹ค๋ฅธ ํŒŒ์ผ, ํ˜น์€ ๋‚˜์ค‘์— ๋‘ ๋ฒˆ์งธ ์„ ์–ธ
interface UserProfile {
  nickname: string;
}
 
// โœ… ์ž๋™์œผ๋กœ ๋‘ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์ง!
const myProfile: UserProfile = {
  id: 1,
  nickname: "๋ฉ‹์Ÿ์ด์˜์ฒ ",
};

๐Ÿ”’ Type Alias: ๋‹ซํ˜€์žˆ๋Š” ๋ฌธ (Closed)

type์€ ํ•œ ๋ฒˆ ์ง“๊ณ  ๋‚˜๋ฉด ์ ˆ๋Œ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์‹๋ณ„์ž(Alias) ์ž…๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : "ํƒ€์ž…์€ ์™œ ๋‘ ๋ฒˆ ์„ ์–ธํ•˜๋ฉด ํ™”๋ฅผ ๋‚ด์ฃ ?"
 
type UserInfo = {
  id: number;
};
 
// โŒ ์—๋Ÿฌ: ์‹๋ณ„์ž 'UserInfo'๊ฐ€ ์ค‘๋ณต ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
type UserInfo = {
  nickname: string;
};

๐ŸŽฏ 4. ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ์‹ค๋ฌด ๊ฐ€์ด๋“œ๋ผ์ธ

๊ทธ๋ ‡๋‹ค๋ฉด ์˜์ฒ ์ด๋Š” ๋‚ด์ผ ํŒ€ ํšŒ์˜์—์„œ ์–ด๋–ป๊ฒŒ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ํ”ฝ์Šคํ•ด์•ผ ํ• ๊นŒ์š”?
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ณต์‹ ๋ฌธ์„œ์™€ ๊ธ€๋กœ๋ฒŒ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋ฅผ ํ•ฉ์นœ ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฃฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ interface๋ฅผ ๋ฒ ์ด์Šค๋กœ ์‚ผ๋Š”๋‹ค.
    • API ์‘๋‹ต๊ฐ’, ์ปดํฌ๋„ŒํŠธ์˜ Props, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ชจ๋ธ ๋“ฑ์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋ฏ€๋กœ interface๊ฐ€ ๊น”๋”ํ•˜๊ณ  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋„ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
  2. type (ํƒ€์ž… ๋ณ„์นญ)์€ ์•„๋ž˜์™€ ๊ฐ™์€ 'ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ'์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์›์‹œ๊ฐ’์— ์ด๋ฆ„ํ‘œ๋ฅผ ๋ถ™์ผ ๋•Œ: type UserId = string;
    • ์œ ๋‹ˆ์–ธ ํƒ€์ž…์„ ์“ธ ๋•Œ: type Status = "IDLE" | "LOADING" | "ERROR";
    • ๊ต์ฐจ๋‚˜ ํŠœํ”Œ ๊ฐ™์€ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ: type Response = [number, string];
  3. ์ผ๊ด€์„ฑ(Consistency)์ด ์ตœ์šฐ์„ ์ด๋‹ค.
    • ์ด๋ฏธ ํŒ€์ด ์ „๋ถ€ type์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด, ๊ตณ์ด ํ˜ผ์ž interface๋กœ ๋ฐ”๊พธ๋Š” ํˆฌ์Ÿ์„ ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ œ์ผ ๋‚˜์œ ๊ฑด ํ•œ ํŒŒ์ผ ์•ˆ์—์„œ ๋‘ ๊ฐœ๋ฅผ ์„ž์–ด ์“ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. interface์™€ type์„ ํ™œ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ/์—ฐ์‚ฐ์ž๋Š” ๊ฐ๊ฐ ๋ฌด์—‡์ธ๊ฐ€์š”?

โœ… ์ •๋‹ต: interface๋Š” extends ํ‚ค์›Œ๋“œ๋ฅผ, type์€ & (Intersection) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • interface A extends B๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ƒ์†์˜ ๊ฐœ๋…์œผ๋กœ, ์†์„ฑ ์ถฉ๋Œ ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ ์—๋Ÿฌ๋ฅผ ์žก์•„์ค๋‹ˆ๋‹ค.
  • type A = B & C๋Š” ๋‘ ํƒ€์ž…์„ ์ˆ˜ํ•™์ ์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ต์ฐจ ํƒ€์ž…์œผ๋กœ ๋ฌถ์ž…๋‹ˆ๋‹ค.

Q2. ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ์ „์—ญ window ๊ฐ์ฒด)๋‚˜ ๊ธฐ์กด์— ์ •์˜๋œ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ํ™•์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ผ์›Œ ๋„ฃ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

โœ… ์ •๋‹ต: interface์˜ ์„ ์–ธ ๋ณ‘ํ•ฉ(Declaration Merging)์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • type์€ ํ•œ ๋ฒˆ ์„ ์–ธ๋˜๋ฉด ์ŠคํŽ™์ด ๊ณ ์ •๋˜์ง€๋งŒ, interface๋Š” ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์—ด์–ด๋‘๋ฉด ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ(Merge)๋˜๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ™œ์šฉํ•ด interface Window { myGlobalVar: string; } ์ฒ˜๋Ÿผ ๊ธฐ์กด ์ „์—ญ ๊ฐ์ฒด์— ๋‚ด ์ปค์Šคํ…€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ผ์›Œ๋„ฃ๋Š” ๊ธฐ๋ฒ•์ด ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ์ž…๋‹ˆ๋‹ค.

Q3. [์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„: ์‹ค๋ฌด ๋”œ๋ ˆ๋งˆ] ์˜์ฒ ์ด๊ฐ€ ๋ฐฑ์—”๋“œ ์˜์ˆ˜ ๋‹˜๊ณผ ์ƒ์˜ํ•˜๋ฉฐ API ๊ณตํ†ต ์‘๋‹ต ํฌ๋งท์„ ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋Š” data๊ฐ€ ์˜ค๊ณ , ์‹คํŒจํ–ˆ์„ ๋•Œ๋Š” errorMessage๊ฐ€ ์˜ค๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฑธ interface๋กœ ๋งŒ๋“ค๊นŒ์š”?" ๋ผ๊ณ  ์˜์ฒ ์ด๊ฐ€ ๋ฌผ์–ด๋ด…๋‹ˆ๋‹ค. ์˜ํ˜ธ ๋ฆฌ๋“œ๋Š” ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ต์ •ํ•ด ์ค„๊นŒ์š”?

โœ… ์ •๋‹ต: "์˜์ฒ  ๋‹˜, ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ˜•ํƒœ๊ฐ€ ์•„์˜ˆ ๋‹ฌ๋ผ์ง€๋Š” '์œ ๋‹ˆ์–ธ(Union)' ๊ตฌ์กฐ๋Š” interface๊ฐ€ ์•„๋‹ˆ๋ผ type์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒŒ ์ •๋‹ต์ž…๋‹ˆ๋‹ค."

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: interface๋Š” 'ํ•˜๋‚˜์˜ ๊ณ ์ •๋œ ๊ฐ์ฒด ํ˜•ํƒœ'๋ฅผ ๋ฌ˜์‚ฌํ•˜๋Š” ๋ฐ ํŠนํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด "์„ฑ๊ณต ์ƒํƒœ ๊ฐ์ฒด" | "์‹คํŒจ ์ƒํƒœ ๊ฐ์ฒด" ์ฒ˜๋Ÿผ ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋˜๋Š” ์œ ๋‹ˆ์–ธ(OR) ํƒ€์ž…์€ ์˜ค์ง type ํ‚ค์›Œ๋“œ๋กœ๋งŒ ๋ฌถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์ด๊ฑธ ๊ตณ์ด interface ํ•˜๋‚˜์— ๋ชฐ์•„๋„ฃ๊ณ  data?: any, errorMessage?: string ์ฒ˜๋Ÿผ ์ „๋ถ€ ์˜ต์…”๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด, ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ๋„ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒดํฌํ•ด์•ผ ํ•˜๋Š” ์ง€์˜ฅ์ด ํŽผ์ณ์ง‘๋‹ˆ๋‹ค."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๊ณ ์ •๋œ ๋ผˆ๋Œ€๋Š” Interface! ์ด๊ฒƒ ๋˜๋Š” ์ €๊ฒƒ(Union) ์กฐ๊ฑด์˜ ๊ฒฐํ•ฉ์€ Type!

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

๐Ÿ’ก "Interface๋Š” ์–ธ์ œ๋“  ์ฆ์ถ• ๊ฐ€๋Šฅํ•œ ์กฐ๋ฆฝ์‹ ํŒ๋„ฌ ์ง‘์ด๊ณ , Type์€ ์„ค๊ณ„๋„๊ฐ€ ๊ตณ์–ด๋ฒ„๋ฆฐ ์ฃผ๋ฌผ(Casting)์ด๋‹ค."

์˜ค๋Š˜๋„ ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์˜ ๋น„์œ ์— ์ด๋งˆ๋ฅผ ํƒ ์ณค๋‹ค. ๊ทธ๋™์•ˆ ์ปจ๋ฒค์…˜ ๋…ผ์Ÿ ๋œฐ ๋•Œ๋งˆ๋‹ค ๊ฟ€๋จน์€ ๋ฒ™์–ด๋ฆฌ์˜€๋Š”๋ฐ, ์ด์ œ ๋ˆ„๊ฐ€ ๋ฌผ์–ด๋ณด๋ฉด '์„ ์–ธ ๋ณ‘ํ•ฉ'์ด๋ผ๋Š” ๊ณ ๊ธ‰ ์–ดํœ˜๋ฅผ ์“ฐ๋ฉด์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€? (๋ฟŒ๋“ฏ)
๋ฐฑ์—”๋“œ API ๋ชจ๋ธ์€ interface๋กœ ์ซ™ ๋งž์ถ”๊ณ , ๋ฆฌ๋•์Šค ์•ก์…˜์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ ๊ฐ™์€ ์œ ๋‹ˆ์–ธ ํƒ€์ž…๋“ค์€ type์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฑธ๋กœ ๋‚ด์ผ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์— ํ•˜๋‚˜ ์จ๋†”์•ผ๊ฒ ๋‹ค. ์•„ ๋ชฉ๋งˆ๋ฅด๋‹ค, ์ง‘ ๊ฐ€๋Š” ๊ธธ์— ์ œ๋กœ ์ฝœ๋ผ ํ•˜๋‚˜ ์‚ฌ์„œ ์˜ค๋Š˜ ์ง  ์ปจ๋ฒค์…˜ ๋ฌธ์„œ ํ•œ ๋ฒˆ ๋” ์ •๋…ํ•ด์•ผ์ง€!