[Typescript] 인터페이스

Bam·2023년 8월 30일
0

Typescript

목록 보기
22/32
post-thumbnail

인터페이스(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 {}

0개의 댓글