Type vs Interface

ν•™μŠ΅ ν‚€μ›Œλ“œ

  • νƒ€μž…λ³„μΉ­(Type)

  • μΈν„°νŽ˜μ΄μŠ€(interface)

  • νƒ€μž…λ³„μΉ­(Type) vs μΈν„°νŽ˜μ΄μŠ€(interface)

νƒ€μž…λ³„μΉ­

  • λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ“― νƒ€μž…μ„ λ³„λ„λ‘œ μ •μ˜ν•  수 μžˆλ‹€.

  • type νƒ€μž…μ΄λ¦„ = νƒ€μž… νƒ€μž…μ˜ 이름은 λŒ€λ¬Έμžλ‘œ 지정

type TGender = 'female' | 'male';
type TUser = {
  name: string;
  age: number;
  gender: TGender; // πŸ‘ˆπŸ» type별칭 μ•ˆμ— λ˜λ‹€λ₯Έ typeλ³„μΉ­μœΌλ‘œ 적용이 κ°€λŠ₯ν•˜λ‹€.
};

const user1: TUser = {
  name: '홍길동',
  age: 20,
};

🚨 λ™μΌν•œ μŠ€μ½”ν”„ λ‚΄μ—μ„œλŠ” λ™μΌν•œ μ΄λ¦„μ˜ νƒ€μž…λ³„μΉ­μ„ μ„ μ–Έν•˜λŠ”κ²ƒμ€ λΆˆκ°€λŠ₯ν•˜λ‹€!

type TUser = {
  name: string;
  age: number;
};

type TUser = {
  // ❎ λ™μΌν•œ 이름이 νƒ€μž… 지정은 μ•ˆλœλ‹€.
};
type TUser = {
  name: string;
  age: number;
};

function Test() {
  type TUser = {
    // βœ… μŠ€μ½”ν”„κ°€ λ‹€λ₯΄λ©΄ λ™μΌν•œ 이름 μ‚¬μš© κ°€λŠ₯
    name: string;
    address: string;
  };

  const user: TUser = {
    name: '홍길동',
    address: 'μ„œμšΈνŠΉλ³„μ‹œ',
  };
}

🚨 νƒ€μž…μ„ λ¦¬ν„°λŸ΄λ‘œ 지정해둔닀면?

type TGender = 'female' | 'male';
type TUserPick = {
  name: string;
  age: number;
  gender?: TGender; // πŸ‘ˆπŸ»  νƒ€μž…μ„ 'female' | 'male' 라고 λ¦¬ν„°λŸ΄ λ°©μ‹μœΌλ‘œ 지정
};

const user1 = {
  name: 'μ΄λ‚˜μ˜',
  age: 30,
  gender: 'female', // πŸ‘ˆπŸ» νƒ€μž…μΆ”λ‘ μ— μ˜ν•΄ νƒ€μž…μ€ string 지정
};

const user2: TUserPick = user1; // 🚨 gender의 νƒ€μž…μ΄ λ§žμ§€ μ•Šμ•„, error

νƒ€μž…λ³„μΉ­μ˜ ν™•μž₯

  • & μ—°μ‚°μžλ₯Ό μ΄μš©ν•œ ν™•μž₯

type Person = {
  name: string;
  age: number;
};

type MyWorker = Person & {
  // & μ—°μ‚°μžλ₯Ό 톡해 νƒ€μž… ν™•μž₯
  company: string;
  readonly position: string; // ν•΄λ‹Ή ν‚€μ›Œλ“œκ°€ λΆ™κ²Œλ˜λ©΄ 값을 μ½μ–΄μ˜€λŠ”κ±΄ λ˜μ§€λ§Œ, λ³€κ²½ν•˜λŠ”κ±΄ ν•  수 μ—†λ‹€.
  getMoney: (amount: number) => number;
};

type Employ = Person & MyWorker; // μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•΄μ„œ & μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ ν™•μž₯법

βœ… μ½κΈ°μ „μš© readonly : ν•΄λ‹Ή ν‚€μ›Œλ“œκ°€ 뢙이면 값을 μ½λŠ”κ±΄, 객체의 value κ°’ λ³€κ²½ν•˜λŠ”κ±΄ ν•  수 μ—†λ‹€.

interface Person {
  readonly name: string;
  age?: number;
}

const person: Person = {
  name: 'κΉ€μ² μˆ˜',
  // age: 27,
};

person.name = '홍길동'; // ❌

μΈν„°νŽ˜μ΄μŠ€

  • νƒ€μž… 별칭과 λ™μΌν•˜κ²Œ νƒ€μž…μ— 이름을 μ§€μ–΄μ£ΌλŠ” 또 λ‹€λ₯Έ 문법

  • μ›μ‹œνƒ€μž…μ€ 지정할 수 μ—†κ³ , 객체 νƒ€μž…λ§Œ 지정 κ°€λŠ₯

  • interface νƒ€μž…μ΄λ¦„ {} νƒ€μž…μ˜ 이름은 λŒ€λ¬Έμžλ‘œ 지정

interface Person {
  name: string;
  age: number;
}

⭐️ λ™μΌν•œ μŠ€μ½”ν”„ λ‚΄μ—μ„œλŠ” λ™μΌν•œ μ΄λ¦„μ˜ μΈν„°νŽ˜μ΄μŠ€ 선언이 κ°€λŠ₯ν•˜λ‹€!

interface IBox {
  width: number;
  height: number;
}

interface IBox {
  shape: string;
}

const boxModel2: IBox = {
  width: 20,
  height: 30,
  shape: 'λ„€λͺ¨',
};

μΈν„°νŽ˜μ΄μŠ€μ˜ ν™•μž₯

  • & μ—°μ‚°μžλ₯Ό ν™œμš©ν•œ ν™•μž₯

interface IPerson {
  name: string;
  age: number;
}

interface IWorker {
  company: string;
  readonly position: string;
  getMoney: (amount: number) => number;
}

const employee: IWorker & IPerson = {
  name: 'μ΄λ‚˜μ˜',
  age: 30,
  company: 'google',
  position: 'teacher',
  getMoney: (amount: number) => {
    return amount;
  },
};
  • extendsλ₯Ό μ‚¬μš©ν•œ ν™•μž₯

interface IUser {
  name: string;
  age: number;
}

interface IUserAddress extends IUser {
  code: string;
  address: string;
}

const userAddress: IUserAddress = {
  name: 'κΉ€μ² μˆ˜',
  age: 20,
  code: '13456',
  address: 'μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ',
};

닀쀑확μž₯

  • ,λ₯Ό μ‚¬μš©ν•œ ν™•μž₯

interface IUser {
  name: string;
  age: number;
}

interface IWorker {
  company: string;
  readonly position: string;
  getMoney: (amount: number) => number;
}

interface IUserAddress extends IUser, IWorker {
  // νƒ€μž…μ„ ν™•μž₯ν•  λ•Œ extendsλ₯Ό 톡해 ν™•μž₯ν•œλ‹€. ( , λ₯Ό 톡해 ν™•μž₯ κ°€λŠ₯ )
  code: string;
  address: string;
}

const userAddress: IUserAddress = {
  name: 'κΉ€μ² μˆ˜',
  age: 20,
  code: '13456',
  address: 'μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ',
  company: 'google',
  position: 'teacher',
  getMoney: (amount: number) => {
    return amount;
  },
};

νƒ€μž…λ³„μΉ­(Type) vs μΈν„°νŽ˜μ΄μŠ€(interface)

  • μ„ μ–Έλ°©μ‹μ˜ 차이

  • ν™•μž₯λ°©μ‹μ˜ 차이

πŸ€₯ 개발자의 μ·¨ν–₯에 따라 μ‚¬μš©ν•˜λŠ” 방식이 λ‹€λ₯ΌλΏ λ‘κ°€μ§€μ˜ 큰 μ°¨μ΄λŠ” μ—†λ‹€.

πŸ”— μ°Έκ³ 

Last updated