타입스크립트 시작한 지 얼마 안 됐는데 객체 타입을 정의할 때 interface로도 되고 type으로도 돼서 뭘 써야 할지 매번 고민돼요.


둘 다 똑같이 되는 것처럼 보이거든요.


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

type User2 = {
  name: string;
  age: number;
};


이 둘이 실질적으로 무슨 차이가 있는 건가요. 그냥 취향 차이인 건지 아니면 상황에 따라 골라 써야 하는 건지 모르겠어요.


제가 찾아본 거로는 type은 유니온 같은 것도 되던데


type Status = 'success' | 'error' | 'loading';
type ID = string | number;


이런 건 interface로는 안 되는 것 같더라고요. 그럼 유니온이나 이런 게 필요하면 type을 쓰고 객체 모양만 정의할 땐 interface를 쓰면 되는 걸까요?


그리고 어디서는 interface가 선언 병합(같은 이름으로 또 선언하면 합쳐지는 거)이 된다는 얘기도 봤는데 이게 실무에서 언제 쓸모가 있는 건지도 잘 모르겠어요. extends로 상속하는 거랑 & 로 합치는 것도 뭐가 다른지 헷갈리고요.


팀 코드 보면 어떤 사람은 전부 interface만 쓰고 어떤 사람은 전부 type만 쓰던데, 그냥 하나로 통일하면 되는 건지 아니면 명확한 기준이 있는 건지 조언 부탁드려요.