SUE 개발 블로그

TypeScript ) 인터페이스 본문

TypeScript

TypeScript ) 인터페이스

이수광 2024. 2. 22. 17:34

인터페이스란 ? 

타입 별칭과 동일하게 타입에 이름을 지어주는 또 다른 문법이다.

 

예제 )

interface Person {
  name: string;
  age: number;
}

 

이렇게 정의한 인터페이스를 타입 주석과 함께 사용해 변수의 타입을 정의할 수 있다.

const person: Person = {
  name: "수보이",
  age : 26
};

 

이렇듯 인터페이스는 타입 별칭과 문법만 조금 다를 뿐 기본적인 기능은 같다고 볼 수 있다.

읽기 전용 프로퍼티

읽기 전용 프로퍼티 또한 동일한 방법으로 설정 가능하다.

interface Person {
  readonly name: string;
  age?: number;
}

const person: Person = {
  name: "이수광",
  // age: 26,
};

person.name = '홍길동' // ❌

메서드 타입 정의하기

다음과 같이 메서드의 타입을 정의하는 것 또한 가능하다.

interface Person {
  readonly name: string;
  age?: number;
  sayHi: () => void;;
}

 

함수 타입 표현식을 이용해 sayHi 메서드의 타입을 정의했다.

함수 타입 표현식 말고 다음과 같이 호출 시그니처를 이용해 메서드의 타입을 정의할 수도 있다.

interface Person {
  readonly name: string;
  age?: number;
  sayHi(): void;
}

메서드 오버로딩

함수 타입 표현식으로 메서드의 타입을 정의하면 메서드의 오버로딩 구현이 불가능하다.

interface Person {
  readonly name: string;
  age?: number;
  sayHi: () => void; 
  sayHi: (a: number, b: number) => void; // ❌
}

 

그러나 호출 시그니처를 이용해 메서드의 타입을 정의하면 오버로딩 구현이 가능하다.

interface Person {
  readonly name: string;
  age?: number;
  sayHi(): void;
  sayHi(a: number): void;
  sayHi(a: number, b: number): void;
}

하이브리드 타입

인터페이스 또한 함수이자 일반 객체인 하이브리드 타입을 정의 할 수 있다.

interface Func2 {
  (a: number): string;
  b: boolean;
}

const func: Func2 = (a) => "hello";
func.b = true;

주의할 점

인터페이스는 대부분의 상황에 타입 별칭과 동일하게 동작하지만 몇가지 차이점이 있다.

타입 별칭에서는 다음과 같이 Union 이나 Intersection 타입을 정의할 수 있었던 반면 인터페이스는 불가하다.

type Type1 = number | string;
type Type2 = number & string;

interface Person {
  name: string;
  age: number;
} | number // ❌

 

따라서 인터페이스로 만든  타입을 Union 또는 Intersection 으로 이용해야 한다면

다음과 같이 타입 별칭과 함께 사용하거나 타입 주석에서 직접 사용해야 한다.

type Type1 = number | string | Person;
type Type2 = number & string & Person;

const person: Person & string = {
  name: "수보이",
  age: 26,
};