프로그래밍풀스택 개발자

타입스크립트에서 오버로드된 클래스 생성자를 어떻게 구현하고 타입을 지정할 수 있나요? 여러 생성자 메소드를 단순히 지정할 수 없는 이유와 이를 올바르게 달성하는 방법은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

타입스크립트는 많은 OOP 언어에서 가능하듯이 하나의 클래스에 여러 생성자 본문을 지원하지 않습니다. 대신, 여러 생성자 시그니처(오버로드)를 선언한 다음, 인자를 수동으로 처리하는 단일 생성자 본문을 구현할 수 있습니다:

class User { name: string; age: number; constructor(name: string); constructor(name: string, age: number); constructor(name: string, age?: number) { this.name = name; this.age = age ?? 18; } } const u1 = new User('Alice'); // age = 18 const u2 = new User('Bob', 32); // age = 32

중요한 세부사항:

  • 클래스에 위에 구현이 아닌 여러 시그니처를 지정할 수 있지만, 생성자 구현은 단 하나만 허용됩니다.
  • 생성자 구현은 모든 오버로드 변형과 호환되어야 합니다.
  • 타입스크립트는 인자가 오버로드와 일치하는지 자동으로 확인합니다.

딜레마 질문.

«생성자를 이렇게 구현할 수 있나요?»

undefined

class Test { constructor(x: number) {} constructor(x: string) {} }


**정답:** 아닙니다, 이 코드는 "중복 생성자 구현" 오류를 발생시킵니다. 타입스크립트는 생성자 본체에 대해 단 하나의 구현만 허용하며, 오버로드는 시그니처 형태로 정의해야 합니다.

### 주제에 대한 미숙지로 인한 실제 오류 사례.

---
> 이야기

프로젝트에서 Java의 경험을 복사하여 서로 다른 매개변수를 가진 두 생성자로 클래스를 구현하려고 했습니다. 결과적으로 타입스크립트는 컴파일 오류를 발생시키며, 프로젝트가 빌드되지 않아 오버로드를 시그니처로 변경해야 했습니다.

---
> 이야기

팀의 한 구성원이 오버로드된 생성자를 작성했지만, 선택적 매개변수(정의되지 않은 상태를 처리하지 않음)를 고려하는 것을 잊었습니다. 이로 인해 존재하지 않는 값에 접근하려고 하여 최소 매개변수 집합으로 인스턴스를 생성할 때 충돌이 발생했습니다.

---
> 이야기

생성자 오버로드가 선언되었지만, 생성자 본체가 호출 패턴과 일치하지 않았습니다. 한 경우에 필수 두 번째 인자가 예상되었지만, 시그니처에서는 선택적으로 지정되어 있었습니다. 이러한 충돌은 즉시 발견되지 않았지만, 단위 테스트를 작성할 때 드러났고 디버깅을 어렵게 만들었습니다.