👶 TypeScript

선언 합침

개발자 린다씨 2023. 1. 15. 14:00
반응형

선언 합침(declaration merging)

선언 합침은 같은 이름으로 정의된 여러 정의를 자동으로 합치는 TypeScript의 기능입니다. 

 

이번 글에선 인터페이스라는 맥락에서 간단하게 선언 합침을 살펴보겠습니다.

 

예를 들어 Member라는 똑같은 이름의 인터페이스를 두 개 정의하면 TypeScript는 자동으로 둘을 하나의 인터페이스로 합칩니다.

// Member는 name이라는 한 개의 필드를 가짐
interface Member {
  name: string
}

// 여기서 Member는 name과 age 두 개의 필드를 가짐
interface Member {
  age: number
}

let a : Member = {
  name: 'Linda',
  age: 24
}

이 코드를 타입 별칭으로 표현하면 아래와 같은 일이 일어납니다.

type Member = { // 'Member' 식별자가 중복되었습니다.ts(2300)
  name: string
}

type Member = { // 'Member' 식별자가 중복되었습니다.ts(2300)
  age: number
}

한편 인터페이스끼린 충돌해선 안됩니다. 한 타입의 프로퍼티는 T와 다른 타입의 프로퍼티 U가 동일하지 않다면 에러가 발생합니다.

interface Member {
  age: string
}

interface Member {
  age: number // 후속 속성 선언에 같은 형식이 있어야 합니다. 'age' 속성이 'string' 형식이어야 하는데 여기에는 'number' 형식이 있습니다.ts(2717)
}

제네릭을 선언한 인터페이스들의 경우 제네릭들을 선언 방법과 이름까지 똑같아야 합칠 수 있습니다.

interface Member <Age extends number>{ // 'Member'의 모든 선언에는 동일한 형식 매개 변수가 있어야 합니다.ts(2428)
  age: Age
}

interface Member <Age extends string> {
  age: Age
}

위의 경우는 TypeScript가 두 타입이 서로 동일할 뿐 아니라 할당할 수 있는지까지 확인하는 보기 드문 상황입니다.

반응형