typeScript를 작성하다보면 type과 interface의 사용 용도가 비슷하고 문법도 거의 비슷하게 생겼다 그럼 어떤 문법을 어느 순간에 사용해야 공식문서에 의도에 맞게 사용하는지 궁금해서 이를 구글에 검색해봤던 경험이 다들 있을꺼라고 생각한다 아마도...?
위 typeScript 공식 문서에 나와있는 type alias와 interface의 차이점이다.
위 내용을 의역해보면 type과 interface 모두 타입에 이름을 부여해주지만 type alias는 모든 타입에 이름을 달아줄 수 있지만 interface는 객체 타입에만 가능하다.
그럼 오브젝트 타입에서는 type alias와 interface 둘중에 어떤걸 사용해야할까?
type과 interface 문법도 비슷하다.
interface Position {
x: number;
y: number;
};
interface Position {
z: number;
}
const object: Position = {
x: 1,
y: 2,
z: 3,
};
interface의 경우 위 문법처럼 동일한 interface를 사용해서 타입을 추가할 수 있다.
이렇게 만든이유가 무엇일까 생각을 해봤는데 타입은 언제든지 변할 수 있다는걸 전제해놓고 만들어 놓은거 같다.
서드 파티 라이브러리의 경우 우리가 직접 수정할 수는 없기 때문에 외부에서 개발도중에 추가적인 데이터가 선언 되어야 하는경우 interface를 사용하면 외부에서 추가할 수 있는 기능을 넣고 싶어서 넣었다는 생각이 든다.
하지만 type alias 경우에는 위와 같은 문법이 불가능하다.
type Person = {
name: string;
age: number;
};
type Name = Person['name'];
type alias 같은 경우 위 코드처럼 기존 타입의 값을 참조해서 type에 할당하는 문법이 가능하다.
type NumberType = number;
type Direction = 'up' | 'down';
추가적으로 위와 같은 문법도 type alias만 가능하다.
두 가지를 판단의 근거로 삼으면 될꺼 같다.
- 해당 타입은 규격사항으로 사용이 될지 아니면 단순히 데이터의 타입을 알려주는 용도인지의 유무에 따라서 선택하는 방법이다.
type Position = {
x: number;
y: number;
};
const coor: Position = { x: 0, y: 1};
위와 같은 객체에서는 단순히 데이터 타입을 명시해주는 용도로만 사용이 된다. 그렇기 때문에 type alias를 사용하는게 좋다.
interface CoffeeMaker {
beans: number;
makeCoffee: (shots: number) => Coffee;
}
class CoffeeMachine implements CoffeeMaker {
beans: number;
makeCoffee(shots: number) {
return {};
}
}
반대로 class를 만드는경우 어떤 규격사항을 지켜서 만들어야 하는지등을 명시해주고 싶은 경우에는 interface를 사용하는게 좋다.
물론 type을 사용해도 똑같이 동작한다.
- 두 번째는 확장이 가능한 타입을 선언하고 싶은 경우에는 interface를 사용하는 경우이다.
내가 만든 라이브러리를 외부에서 사용해야 하는 경우 type으로 선언해버리면 라이브러리를 사용하는 사용자는 타입을 자유롭게 확장하는게 어렵다.
이를 type으로 구현하고 싶으면 추가적으로 intersection 문법을 이용해서 확장해야한다.