type 뿐만 아니라 interface를 통해 타입을 선언할 수 있다.
type과의 차이점
현재 아래를 보면 interface로 UserI 타입을 선언했다. 하지만 UserI 타입인 user2에 isValid가 없어서 에러가 발생한다.
key 뒤에 ?를 붙이면 필수 속성이 아니라는 것을 나타낸다.
따라서 isValid가 없어도 에러가 발생하지 않는다.
interface뿐만 아니라 type에서도 사용 가능하다.
key 앞에 readonly를 작성하면 해당 key는 읽기 전용이 된다.
타입을 선언할 때는 쉼표, 세미콜론을 통해 구분하고 생략도 가능하다.
type과 interface의 차이점은 거의 없지만 개체 타입을 정의할 때는 interface를 사용하는 것을 추천한다.
호출 시그니처(Call signature)를 통해 interface로 함수 타입을 정의할 수 있다.
클래스 자체를 데이터처럼 인수로 사용해서 매개변수로 받아서 생성자 함수를 호출할 때 해당하는 매개변수에는 생성자 시그니처가 있는 타입이 적용되어야 한다.
생성 시그니처(Construct signature)를 통해 생성자 타입을 정의할 수 있다.
인덱스 시그니처(Index signature)를 통해 인덱싱 가능한 타입을 선언할 수 있다.
인덱스 시그니처를 사용하여 다른 속성들을 추가하는 것을 가능하게 할 수 있다.
interface에 명확하게 정의되어 있는 속성을 조회할 때는 인덱스 시그니처가 필요없다.
아래 예제는 payload의 타입에 인덱스 시그니처가 없어서 오류가 발생하고 있다.
이 때 매개변수로 전달하는 user와 매개변수로 받는 payload의 타입에 모두 인덱스 시그니처를 작성해줘야 한다.
interface 내부에 정의되어있는 타입도 인덱싱 할 수 있다.
extends 키워드를 통해서 타입을 확장해서 선언할 수 있다.
또한 extends 키워드를 사용하지 않고 타입을 중복 선언 해도 덮어쓰지 않고 병합된다.
단 인터페이스를 중복 선언 할때는 기존의 존재하는 속성을 중복해서 사용할 때 타입이 일치해야 한다.