TypeScript/한 입 크기로 잘라먹는 타입스크립트

[인터페이스] 인터페이스 선언 합치기

해갈 2023. 7. 13. 18:05

해당 게시글은

강의 사이트, 인프런에서 이정환님이 진행하시는

'한 입 크기로 잘라먹는 타입스크립트' 

들어보며 블로그를 작성하려고 합니다.

다음 게시글 내용은 해당 강의에 핸드북의 내용으로

출처는 다음과 같습니다.

 

https://ts.winterlood.com/7250edd7-a3fd-4662-b756-f11f927c73f2

 

타입스크립트를 소개합니다 - 타입스크립트 개론

한 입 크기로 잘라먹는 타입스크립트

ts.winterlood.com

 

section5/chapter2.ts 에서 실습을 진행했습니다.

 

선언 합침

타입 별칭은 동일한 스코프 내에 중복된 이름으로 선언할 수 없는 반면

인터페이스는 가능합니다.

// 타입 별칭
type Person = {
  name: string;
};

type Person = { ❌
  age: number;
};


// 인터페이스
interface Person {
  name: string;
}

interface Person { // ✅
  age: number;
}

이렇게 되는 이유는 중복된 이름의 인터페이스 선언은

결국 모두 하나로 합쳐지기 때문입니다.

 

따라서 위 코드에 선언한 Person 인터페이스들은 결국 합쳐져

다음과 같은 인터페이스가 됩니다.

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

 

이렇게 동일한 이름의 인터페이스들이 합쳐지는 것

"선언 합침(Declaration Merging)" 이라고 부릅니다.

 

따라서 다음과 같이 사용할 수 있습니다.

interface Person {
  name: string;
}

interface Person {
  age: number;
}

const person: Person = {
  name: "이정환",
  age: 27,
};

 

주의할 점

그런데 만약 다음과 같이

동일한 이름의 인터페이스들이 동일한 이름의 프로퍼티를

서로 다른 타입으로 정의한다면

오류가 발생합니다.

interface Person {
  name: string;
}

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

첫 번째 Person 에서는 name 프로퍼티의 타입을 string 으로

두 번재 Person 에서는 name 프로퍼티의 타입을 number 타입으로 정의했습니다.

이렇게 동일한 프로퍼티의 타입을

다르게 정의한 상황"충돌" 이라고 표현하며

선언 합침에서 이런 충돌은 허용되지 않습니다.