Frontend 개발자 - hyo.loui

νƒ€μž…μŠ€ν¬λ¦½νŠΈ - interface (μΈν„°νŽ˜μ΄μŠ€) λ³Έλ¬Έ

Typescript

νƒ€μž…μŠ€ν¬λ¦½νŠΈ - interface (μΈν„°νŽ˜μ΄μŠ€)

hyo.loui 2023. 1. 18. 13:17

🎯λͺ©μ  :

TS  Interface (μΈν„°νŽ˜μ΄μŠ€), 정리 및 볡슡

 


1. μΈν„°νŽ˜μ΄μŠ€λž€?

μ•žμ„œ μ„€λͺ…ν•œ νƒ€μž… 얼라이어와 같이 객체의 ν˜•νƒœλ‘œ κ΅¬μ„±λœλ‹€

ν•˜μ§€λ§Œ, λ‘˜μ€ 차이점이 μ‘΄μž¬ν•˜κ³  μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž… 체크λ₯Ό μœ„ν•΄

λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“± 쒀더 λ‹€μ–‘ν•œ 곳에 μ‚¬μš©ν•  수 μžˆλ‹€.

 

// interface

// κΈ°λ³Έ 속성
interface Person {
  name: string;
  age: number;
}

const person_1: Person = {
  name: "tmdgy",
  age: 14,
};

// Error: interfaceμ—μ„œ ν• λ‹Ήν•˜μ§€ μ•Šμ€ λ‹€λ₯Έ νƒ€μž…μ„ μ‚¬μš©μ‹œ μ—λŸ¬λ°œμƒ
// const person2:Person = {
//   name: 12,
//   age: 'one'
// }

 


2.  type   vs   interface

λ‘˜μ˜ 차이점을 μ•Œμ•„λ³΄μž

 

  • ν™•μž₯ 방법
// interface ν™•μž₯ 방법 = extends

interface PeopleInterface {
  name: string
  age: number
}

interface StudentInterface extends PeopleInterface {
  school: string
}
// type ν™•μž₯ 방법: newType = prevType & addType

type PeopleType = {
  name: string
  age: number
}

type StudentType = PeopleType & {
  school: string
}

 

  • 선언적 ν™•μž₯
interface teset {
  title: string;
}

interface teset {
  ts: number;
}

// 같은 interface λͺ…μœΌλ‘œ tesetλ₯Ό λ‹€μ‹œ λ§Œλ“ λ‹€λ©΄, μžλ™μœΌλ‘œ ν™•μž₯이 λœλ‹€.

const text: teset = {
  title: "header",
  ts: 12,
};

console.log("πŸ‘‰πŸ‘‰  text", text); // πŸ‘‰πŸ‘‰  text { title: 'header', ts: 12 }
  •  type 은 λΆˆκ°€λŠ₯ ν•˜λ‹€

 

  • computed value의 μ‚¬μš©: type은 κ°€λŠ₯ , interfaceλŠ” λΆˆκ°€λŠ₯ (μƒλž΅)

3. 'κΈ°λ³Έ 속성'κ³Ό '선택 속성'

 

κΈ°λ³Έ 속성은 ν• λ‹Ήν•˜λŠ” 값을 κ·ΈλŒ€λ‘œ λ„£μ–΄μ€˜μ•Ό ν•˜μ§€λ§Œ

μ„ νƒμ μœΌλ‘œ 'Optional chaining' 을 톡해

값을 μ„ νƒμ μœΌλ‘œ ν• λ‹Ήν•  수 μžˆλ‹€.

 

즉, 넣어도 되고 μ•ˆλ„£μ–΄λ„ λ˜λŠ” 값을 λ§Œλ“€μ–΄ 쀄 수 μžˆλ‹€.

// κΈ°λ³Έ 속성

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

const person_1: Person = {
  name: "seung hyo",
  age: 14,
};
// 선택 속성

interface Person2 {
  name: string;
  age?: number; // optional chaining
}

const person_2: Person2 = {
  name: "seung hyo",
  // ageκ°€ μžˆμ–΄λ„ 되고, 없어도 됨
};

μ—λŸ¬ 없이 정상 μž‘λ™ν•œλ‹€!


4. Read Only (읽기 μ „μš©) 

readonlyλ₯Ό μž‘μ„±ν•˜λ©΄

읽기 μ „μš©μœΌλ‘œ 지정해, μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€

// Read Only
interface Person3 {
  readonly name: string;
  age?: number;
}

const person_3: Person3 = { name: "js" };
// person_3.name = "her"; // 읽기 μ „μš© μ†μ„±μœΌλ‘œ Error

// RaedOnlyArray
let readOnlyArr: ReadonlyArray<number> = [1, 2, 3];
// readOnlyArr.push(4); // Error
// readOnlyArr[0] = 2; // Error

console.log("πŸ‘‰πŸ‘‰  readOnlyArray", readOnlyArr[0]); //πŸ‘‰πŸ‘‰  readOnlyArray 1

5. INDEX νƒ€μž…

μΆ”κ°€ μƒμ„±λ˜λŠ” 객체의 μ†μ„±μ˜ νƒ€μž…μ„ 지정해 쀄 수 μžˆλ‹€.

// INDEX νƒ€μž…

interface Person4 {
  readonly name: string;
  [key: string]: string | number; // INDEX type
}

const person_4: Person4 = { name: "js", age: 14, birthday: "λΉ„λ°€" };
console.log("πŸ‘‰πŸ‘‰  person_4", person_4); //πŸ‘‰πŸ‘‰  person_4 { name: 'js', age: 14, birthday: 'λΉ„λ°€' }

6. ν•¨μˆ˜(funciton) νƒ€μž…

ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°, return의 νƒ€μž…을 지정해 쀄 수 μžˆλ‹€.

// ν•¨μˆ˜ νƒ€μž…

// interface
interface Person5 {
  (name: string, age: number): string;
}

// type
type Print = (name: string, age: number) => string;

const getName: Person5 = (name, age) => {
  return `name: ${name}, age: ${age}`;
};

const get1 = getName("seung hyo", 12);
console.log("πŸ‘‰πŸ‘‰  get1", get1); // πŸ‘‰πŸ‘‰  get1 name: seung hyo, age: 12

 


 

 μ΅œμ’… 정리 

  1. νƒ€μž…μ— λΉ„ν•΄, μΈν„°νŽ˜μ΄μŠ€μ˜ ν™œμš©λ²”μœ„κ°€ λ„“μœΌλ©° μ‹€μ œ μ‚¬μš© λΉˆλ„κ°€ λ” λ§Žλ‹€
  2. μ„±λŠ₯을 μœ„ν•΄μ„œλŠ” interfaceκ°€ μ’‹μœΌλ‚˜, ν”„λ‘œμ νŠΈ μ „λ°˜μ— λ…Όμ˜κ°€ ν•„μš”ν•΄ 보인닀(type & interface)
  3. TS의 interfaceμ—μ„œλ„ μ˜΅μ…”λ„ 체이닝이 κ°€λŠ₯ν•΄, 넣어도 되고 μ•ˆλ„£μ–΄λ„ λ˜λŠ” 값을 λ§Œλ“€μ–΄ 쀄 수 μžˆλ‹€
  4. readonlyλ₯Ό μž‘μ„±ν•˜λ©΄ 읽기 μ „μš©μœΌλ‘œ μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ν•œ νƒ€μž…μ„ λ§Œλ“€μ–΄ μ€€λ‹€.
  5. indexνƒ€μž…μ„ ν™œμš©ν•΄ μΆ”κ°€λ‘œ μƒμ„±λ˜λŠ” 객체 μ†μ„±μ˜ νƒ€μž…μ„ 지정해 쀄 수 μžˆλ‹€.
  6. ν•¨μˆ˜ νƒ€μž…μœΌλ‘œ, νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄μ˜ νƒ€μž…λ„ 지정해 쀄 수 μžˆλ‹€.