1. 어떻게 유사한가?
다음은 x좌표와 y좌표를 갖는 포지션을 두 가지 방식으로 정의한 것이다.
type PositionType = {
x: number;
y: number;
}
interface PositionInterface {
x: number;
y: number;
}
이렇게 정의하면
객체는 타입 또는 인터페이스를 따를 수 있고...
const obj1: PositionType = {
x: 1,
y: 1,
};
const obj2: PositionInterface = {
x: 1,
y: 1,
};
클래스 역시 타입 또는 인터페이스를 구현할 수 있으며...
class Pos1 implements PositionType {
x: number;
y: number;
}
class Pos2 implements PositionInterface {
x: number;
y: number;
}
타입과 인터페이스 모두 확장이 가능하다.
interface ZPositionInterface extends PositionInterface {
z: number;
}
type ZPositionType = PositionType & { z: number };
2. 기능적 차이점
인터페이스는 재선언 함으로써 병합 가능하다. (타입은 재선언 불가)
아래 인터페이스를 구현하려면 x, y, z를 모두 정의해야 한다.
interface PositionInterface {
x: number;
y: number;
}
interface PositionInterface {
z: number;
}
타입은 Utility Types라는 기능을 통해 변환이 가능하다.
아래는 여러 Utility Types 중 Index Type을 통해 변환한 예시이다.
type Person = {
name: string;
age: number;
gender: 'male' | 'female';
};
type Gender = Animal['gender']; // 'male' | 'female'
type Keys = keyof Person; // 'name' | 'age' | 'gender'
3. 보다 근본적인 차이점
타입과 인터페이스는 유사하지만, 그 개념과 사용처가 다르다.
- 인터페이스는 규격을 정의할 때 사용한다. 하나의 인터페이스를 구현하는 여러 클래스는 동일한 규격사항을 따르게 된다.
- 타입은 데이터를 담을 목적이 있을 때 사용한다. 위의 Position 예제는 타입을 사용하는 것이 맞다. 인터페이스를 사용하면 어디선가 이를 구현하는 클래스가 있다고 생각하기 마련이다.
'TypeScript' 카테고리의 다른 글
[TypeScript] 대표적인 유틸리티 타입을 알아보자! (0) | 2021.04.18 |
---|---|
[TypeScript] 인터섹션 타입 Intersection Type (0) | 2021.04.17 |
[TypeScript] 제네릭을 사용하는 이유 (0) | 2021.04.15 |
TypeScript로 이해하는 객체지향 (0) | 2021.04.14 |
[TypeScript] 유니온 타입은 언제 사용하는가? (0) | 2021.04.13 |