본문 바로가기
🔥TS 뽀개기

interface, type 둘 중에 뭘 써야 할까?

by 짱돌보리 2024. 5. 25.
728x90

✨type

  • 모든 종류의 타입을 정의할 수 있는 키워드
  • 숫자, 문자열, 객체, 배열 등 다양한 타입을 선언할 수 있음
type Person = {
  name: string;
  age: number;
  isStudent: boolean;
};

let person: Person = {
  name: 'bori',
  age: 15,
  isStudent: true
};

✨interface

  • 객체의 타입을 정의할 때
  • 객체의 구조와 속성을 정의할 수 있음
interface Person {
  name: string;
  age: number;
  isStudent: boolean;
}

let person: Person = {
  name: 'bori',
  age: 15,
  isStudent: true
};

코드만 봤을 때, 둘의 별 차이가 없어보인다. 둘의 확연한 차이가 무엇일까?

✨타입스크립트 type과 interface의 차이

📍확장성

  • type: 새로운 속성을 추가하려면 동일한 이름의 type을 다시 선언해야 한다. (인터섹션 타입(&)을 사용하여 결합)
  • interface: 동일한 이름의 interface를 선언하면 자동으로 병합되어 확장된다. ( extends 키워드를 사용해 확장 )
type Person = {
  name: string;
  age: number;
};

type Employee = Person & {
  employeeId: number;
};

const employee: Employee = {
  name: 'bori',
  age: 30,
  employeeId: 1234,
};
// 인터페이스 확장
interface Person {
  name: string;
  age: number;
}

interface Employee extends Person {
  employeeId: number;
}

const employee: Employee = {
  name: 'bori',
  age: 30,
  employeeId: 1234,
};
// 인터페이스 병합 예시
interface Person {
  name: string;
}

interface Person {
  age: number;
}

const person: Person = {
  name: 'bori',
  age: 30,
};

// 타입은 병합 불가
type Person = {
  name: string;
};

type Person = {
  age: number; // 오류 발생: 동일한 이름으로 다시 선언할 수 없음
};

📍유니온

  • type: 유니온 타입을 만들 수 있다.
  • interface: 유니온 타입을 만들 수 없다.
// type을 사용한 유니온 타입
type Color = 'red' | 'green' | 'blue';

📍타입 정의

  • type: 모든 종류의 타입을 정의할 수 있다.
  • interface: 객체 타입만 정의할 수 있다.
// type으로 다양한 타입 정의
type Age = number;
type Name = string;
type Person = { name: Name, age: Age };
type Tuple = [string, number];
type Union = string | number;

// interface는 객체 타입만 정의 가능
interface User {
  name: string;
  age: number;
}

그럼 개발할 때, type과 interface 뭘 써야할까?

 

사실 난 type이 더 좋다. 커서를 올렸을 때, type을 쓰면 무슨 타입이 써있는지 한 눈에 볼 수 있어서 좋다.... 하지만, 멘토님은 interface와 type을 섞어 쓴다고 하셨다. 그럼 언제 어느상황에 무엇을 써야할까?

1. 객체의 형태를 정의할 때

interface: 객체의 형태를 정의하는 데 주로 사용한다. (특히, 확장이나 구현이 필요한 경우)

interface User {
  id: number;
  name: string;
}

interface Admin extends User {
  role: string;
}

2. 복잡한 타입 조합이 필요할 때

type: 유니온 타입, 튜플, 교차 타입, 매핑된 타입 등 복잡한 타입 조합이 필요할 때 사용한다.

type ID = number | string;

type Point = {
  x: number;
  y: number;
};

type Shape = Point & {
  radius: number;
};

3. 함수 시그니처를 정의할 때

interface와 type 모두 가능하지만, type이 더 간결할 수 있다.

type Add = (a: number, b: number) => number;

interface IAdd {
  (a: number, b: number): number;
}

4. 제네릭 타입을 사용할 때

interface와 type 모두 가능하지만, type이 더 간결할 수 있다. ( 다양한 타입 조합의 가능성 때문 )

type Response<T> = {
  data: T;
  error: string | null;
};

interface IResponse<T> {
  data: T;
  error: string | null;
}

5. 라이브러리 타입 정의 시

interface: 주로 라이브러리나 외부 모듈의 타입 정의에 사용된다. 여러 타입 정의가 병합될 수 있기 때문에 유지보수가 쉽다.

// 라이브러리의 타입 정의 파일
interface Window {
  myCustomProperty: string;
}

6. 타입 별칭을 사용할 때

type: 특정 타입에 대한 별칭을 정의할 때 유용하다.

type StringOrNumber = string | number;
type Callback = () => void;

interface는 주로 확장성과 구조적인 정의에, type은 더 복잡한 타입 변환과 간결한 정의에 유리하다.
-> 사바사에 맞춰 적절한 것을 쓰자.

근데 난 type 쓸래

 

'🔥TS 뽀개기' 카테고리의 다른 글

타입스크립트 왜 씀?  (2) 2024.05.23