1️⃣ 타입 별칭 (type alias)
type User = {
id: number;
name: string;
}
type 키워드를 사용하여 새로운 타입을 정의
- 객체 뿐만 아니라, 유니온 타입, 튜플, 함수 타입 등을 정의할 수 있다.
✅ 다양한 타입을 표현할 때 유용하다.
type StringOrNumber = string | number;
type Coordinates = [number, number];
type Callback = (value: string) => void;
2️⃣ 인터페이스 (interface)
interface User {
id: number;
name: string;
}
interface 키워드를 사용하여 객체의 구조를 정의
- 오직 객체 타입만 정의 가능 (유니온 타입, 튜플 등은 불가능)
extends 키워드로 확장 가능 (다른 인터페이스를 상속받을 수 있다.)
✅ 인터페이스는 확장이 쉬워서 객체지향 프로그래밍(OOP) 스타일에 적합하다.
interface Admin extends User {
permissions: string[];
}
3️⃣ 타입 별칭 🆚 인터페이스 비교
| 비교 항목 | 타입 별칭 (type alias) | 인터페이스 (interface) |
|---|
| 사용 키워드 | type | interface |
| 객체 타입 정의 | ✅ 가능 | ✅ 가능 |
| 유니온 타입, 튜플, 함수 타입 정의 | ✅ 가능 | ❌ 불가능 |
| 확장 (상속) 가능 여부 | ✅ &(인터섹션) 사용 | ✅ extends 사용 |
| 중복 선언 가능 여부 | ❌ 불가능 (덮어쓰기 됨) | ✅ 가능 (자동으로 병합됨) |
4️⃣ 언제 타입 별칭을 사용해야 할까?
✅ 유니온 타입, 튜플, 함수 타입이 필요할 경우
type ID = string | number;
type Position = [number, number];
type LogFn = (message: string) => void;
✅ 객체 타입을 간단하게 정의할 경우
type User = {
id: number;
name: string;
};
✅ 인터페이스처럼 확장해야 할 필요가 없을 경우
type Point = { x: number; y: number };
5️⃣ 언제 인터페이스를 사용해야 할까?
✅ 객체 타입을 확장(상속)해야 할 경우
interface User {
id: number;
name: string;
}
interface Admin extends User {
permissions: string[];
}
✅ 여러 개의 같은 인터페이스를 선언하여 병합하고 싶을 경우
interface User {
id: number;
}
interface User {
name: string;
}
const user: User = { id: 1, name: "ttining" };
type은 같은 이름으로 다시 선언할 경우, 오류가 발생하지만
interface는 자동으로 병합된다.
✅ OOP 스타일로 클래스를 설계할 경우
interface Animal {
name: string;
makeSound(): void;
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log("멍멍!");
}
}
interface는 클래스에서 구현할 때 유용하다.
🎯 정리
📌 타입 별칭 (type)
- 유니온 타입, 튜플, 함수 타입을 정의할 때 사용
- 확장이 필요 없는 간단한 객체 타입을 정의할 때 사용
📌 인터페이스 (interface)
- 객체 지향 스타일(OOP)로 설계할 때 사용
- 확장(상속)할 가능성이 있는 객체 타입을 정의할 때 사용
- 같은 이름으로 타입을 병합하고 싶을 때 사용
💡 요약
- 확장(상속)이 필요하면
interface 사용
- 유니온 타입, 튜플, 함수 타입이 필요하면
type 사용
- 둘 다 가능하지만 고민될 경우,
interface를 우선 사용(OOP 스타일에서 더 자연스럽기 때문)