인터페이스(Interface)
는 객체의 타입을 지정하는 문법입니다. 객체 타입 정의라는 면에서 타입 별칭과 유사하다고 할 수 있습니다.
인터페이스
는 interface
키워드를 붙임으로써 정의할 수 있습니다.
interface 인터페이스_명 {
객체_프로퍼티_명: 프로퍼티_타입;
}
interface Animal {
name: string;
canFly: boolean;
}
const animal: Animal {
name: 'taro',
canFly: false,
};
인터페이스
로 타입을 정의한 객체를 만들 때 프로퍼티 수가 부족하거나, 프로퍼티가 없거나, 인터페이스에 명시되지않은 프로퍼티(초과 프로퍼티)가 있으면 오류가 발생합니다.
const animal1: Animal {
name: 'Goo',
}; //프로퍼티 개수 부족 에러
const animal2: Animal {}; //빈 객체 에러
const animal3: Animal {
name: 'taro',
canFly: false,
numberOfLegs: 4,
}; //프로퍼티 개수 초과 에러
인터페이스 프로퍼티도 읽기 전용, 선택적 프로퍼티를 적용할 수 있습니다.
interface Animal { readonly name: string; //읽기 전용 프로퍼티 canFly?: boolean; //선택적 프로퍼티 }
인터페이스
에서 메소드의 타입 정의도 가능합니다.
interface Animal {
name: string;
canFly: boolean;
crying: () => void; //함수 타입 표현식
//crying(): void; //함수 호출 시그니쳐
}
이렇게 함수 타입 표현식
과 함수 호출 시그니쳐
두 방식으로 메소드 타입을 정의할 수 있는데, 두 방식간에는 메소드 오버로딩 가능 여부의 차이가 있습니다.
함수 타입 표현식
에서는 메소드 오버로딩이 불가능하지만, 함수 호출 시그니쳐
방식에서는 오버로딩이 가능합니다.
인터페이스
는 다른 인터페이스를 상속받아 확장할 수 있습니다. 확장에는 extends
키워드를 사용합니다.
interface 인터페이스_명 extends 확장_할_인터페이스 {}
확장 받은 인터페이스는 확장한 인터페이스의 프로퍼티를 사용할 수 있습니다.
interface Animal {
name: string;
crying: () => void;
}
interface Dog extends Animal {
color: string;
}
const dog: Dog = {
name: 'Billy',
crying() {
console.log('멍');
},
color: 'black',
};
인터페이스 확장을 이용하면 프로퍼티 타입의 재정의도 가능합니다.
interface Animal {
name: string;
}
interface Dog extends Animal {
name: 'Billy'; //string에서 string 리터럴 타입으로 재정의
}
주의할 점은 인터페이스에서 extends
가 단순 확장의 개념이 아닌 확장하는 타입의 자식 타입이 된다는 것을 의미하기 때문에 재정의하는 프로퍼티 타입은 반드시 확장하는 프로퍼티 타입의 자식 타입으로만 재정의해야합니다.
인터페이스는 여러 인터페이스를 확장할 수 있습니다.
interface Dog {} interface Bird {} interface DogBird extends Dog, Bird {}