프로그래밍백엔드 TypeScript 개발자

TypeScript에서 '교차 타입' (intersection types) 메커니즘에 대해 설명해 주세요. 이를 제대로 사용하는 방법과 함께 직면할 수 있는 함정은 무엇인가요?

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

답변

교차 타입 (&, intersection types)은 여러 타입을 하나의 타입으로 결합할 수 있어 결합된 타입의 모든 속성을 갖습니다.

예:

type Person = { name: string }; type Worker = { job: string }; type WorkingPerson = Person & Worker; // { name: string; job: string } const wp: WorkingPerson = { name: "Leo", job: "Dev" };

이것은 확장 가능한 계약의 구성 및 원시 타입에서 복잡한 타입을 구축할 때 유용합니다.

하지만, 호환되지 않는 타입 (예: type A = { foo: string }type B = { foo: number })이 교차되면 초기화할 수 없는 타입이 생성됩니다.

잘못된 교차의 예:

type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }

함정이 있는 질문

호환되지 않는 데이터 타입을 가진 동일한 필드가 있는 두 타입을 교차하면 어떻게 되나요?

답변: 두 데이터 타입이 동시에 문자열과 숫자가 될 수 없기 때문에 never 타입의 필드가 생성됩니다. 이런 타입은 유효하게 구현할 수 없습니다.

type T1 = { id: string }; type T2 = { id: number }; type T3 = T1 & T2; // { id: never }

주제의 미세한 차이를 모르고 인한 실제 오류의 예


이야기

프로젝트에서 서로 다른 라이브러리의 타입을 교차시키면서, 서로 다른 타입의 동일한 필드가 있다는 것을 인식하지 못했습니다. 결국 의도하지 않은 "불가능한" (never) 타입이 생성되어 API로 보내기 위한 유효한 객체를 생성할 수 없게 되었습니다.


이야기

개발자는 DTO 타입과 도메인 엔티티를 "붙이려고" 했습니다. 교차 결과에서 두 개의 호환되지 않는 속성이 발견되었고, 생성된 타입을 사용하려고 하니 모호한 컴파일 오류가 발생했습니다. 개발자는 원인을 이해하기 전에 디버깅에 시간을 낭비했습니다.


이야기

한 마이크로서비스에서 요청 본문을 설명하기 위한 교차된 타입이 선언되었습니다. API의 변경으로 인해 하나의 속성이 다른 타입으로 바뀌었고, 새로운 변경이 즉시 컴파일 오류를 유발하지 않았습니다 – 문제는 배포 후 런타임에만 나타났습니다.