타입 별칭은 특정 타입이나 인터페이스를 참조할 수 있는 타입 변수를 의미한다.
// string 타입을 사용할 때
const name: string = 'capt';
// 타입 별칭을 사용할 때
type MyName = string;
const name: MyName = 'capt';
interface에도 별칭을 부여할 수 있다.
type Developer = {
name: string;
skill: string;
}
제네릭도 타입 별칭을 사용할 수 있다.
type User<T> = {
name: T
}
타입 별칭은 새로운 타입 값을 생성하는 것이 아니라 정의한 타입에 대해 나중에 쉽게 참고할 수 있도록 이름을 부여하는 것과 같다.
아래는 인터페이스로 선언한 타입과 타입 별칭으로 선언한 타입을 프리뷰로 확인한 결과이다.
타입 별칭과 인터페이스의 가장 큰 차이점은 타입의 확장 가능 여부이다.
인터페이스(interface)는 확장이 가능한데 반해, 타입 별칭(type aliases)은 확장이 불가능하다.
따라서 가능한 한 type보다는 interface로 선언해서 사용하는 것이 좋다.
type test1 = { name: string };
type test2 = test1 & { age: number };
const test3: test2 = { name: "d", age: 33 };
위 방법은 엄밀히 따지면, 인터섹션을 사용하여 test1 타입과 추가된 타입을 합하여 새로운 타입을 정의한 것이지 test1 타입을 extends로 상속받아 확장하는 개념이 아니다.
즉, type은 extends가 안 되기 때문에 웬만하면 interface를 사용해야 한다.
type XYZ = {
x: number;
y: number;
z: number;
};
// y, z 속성을 제외하고 다음과 같이 만들고 싶다면
// type X = { x: number };
// ts 버전 3.5 이상에서는 Omit을 사용하면 된다.
type X = Omit<XYZ, "x" | "y">;