회사에서 TypeScript로 백엔드 api를 만들다가 문득 타입을 선언할 때 interface로 하는 것과 type으로 선언하는 것의 차이가 궁금했다.
(프론트 개발할 때는 type이 익숙해서 type으로 선언했었다)
이펙티브 타입스크립트에 나온 interface와 type의 차이점은
1. 유니온 타입은 있지만 유니온 인터페이스라는 개념은 없다
type A = 'a' | 'b' 가 있지만 인터페이스는 없다
type NamedVariable = ( Input | Output ) & { name: string }; 인터페이스는 왼쪽과 같이 사용할 수 없습니다.
또한 튜플타입은 type 키워드로 구현하는 것이 더 낫다고 합니다.
2. 인터페이스는 타입과 달리 보강(augment)이 가능하다
interface Istate {
name: string;
capital: string;
}
interface Istate {
population: number;
}
const wyoming: Istate = {
name: 'Wyoming',
capital: 'Cheyenne',
population: 500_000
}
위와 같은 것을 선언 병합이라고 하는데 타입 선언에서는 따로 해줘야하는 것이 있다.
결론
이펙티브 타입스크립트에 따르면 결론적으로 복잡한 타입이라면 타입을 사용하면 된다고 한다.
중요한 것은 프로젝트에서 interface를 사용했다면 일관성있게 interface를 쓰고 type을 쓰면 일관성있게 type을 쓰는 것이라고 한다.
API에 대한 타입 선언을 작성해야한다면 인터페이스를 사용하는 것이 좋다. 왜냐하면 API가 변경 될 때 새로운 필드를 병합할 수 있기 때문이다.
따라서 나는 api 쪽 타입 선언을 모두 interface로 바꿨다.
댓글