인터페이스란 타입 별칭과 동일하게 타입에 이름을 지어주는 또 다른 문법으로 상속, 합침 등의 특수한 기능을 제공하기 때문에 객체의 구조를 정의하는데 특화되어 있다.
// 타입 별칭
type A = {
a : string;
b : number;
}
// 인터페이스
interface A {
a : string;
b : number;
}
// 함수 표현식
interface Person {
readonly name: string;
hp?: number;
sayHi: () => void;;
}
// 호출 시그니쳐
interface Person {
readonly name: string;
hp?: number;
sayHi(): void;;
}
함수 타입 표현식으로 메서드의 타입을 정의하면 메서드의 오버로딩 구현이 불가능하다.
그러나 호출 시그니쳐를 이용해 메서드의 타입을 정의하면 오버로딩 구현이 가능하다.
interface Func2 {
(a: number): string;
b: boolean;
}
const func: Func2 = (a) => "hello";
func.b = true;
인터페이스는 타입 별칭과 몇가지 차이점이 존재한다.
위와 같이 타입 별칭에서는 Union이나 Intersection 타입을 정의할 수 있지만, 인터페이스에서는 불가능하다.
따라서, 인터페이스로 만든 타입을 Union 또는 intersection으로 이용해야 한다면 다음과 같이 타입 별칭과 함께 사용하거나
혹은 아래와 같이 타입 주석에서 직접 사용해야 한다.