TypeScript 주니어 기술면접

TypeScript 주니어 (1~3년) 종합 5문항 조회수 68 · 2026-06-05 (금) 03:10:44
1 타입 시스템
Easy

Q. TypeScript에서 type assertion(타입 단언)은 무엇이며, as 키워드와 angle-bracket 문법의 차이점을 설명해주세요. 또한 타입 단언을 사용할 때 주의해야 할 점은 무엇인가요?

A. 모범답안

타입 단언은 개발자가 TypeScript 컴파일러보다 타입을 더 정확히 알고 있을 때 명시적으로 타입을 지정하는 방법입니다. as 키워드(value as Type)와 angle-bracket(<Type>value) 두 가지 문법이 있으며, JSX와 함께 사용할 때는 angle-bracket이 태그 문법과 충돌하므로 as 키워드를 사용해야 합니다. 타입 단언은 실제 런타임 검증 없이 컴파일러만 속이는 것이므로, 잘못 사용하면 런타임 에러가 발생할 수 있어 신중히 사용해야 합니다.

핵심 포인트
  • • 타입 단언은 개발자가 컴파일러에게 타입을 명시적으로 알려주는 방법
  • • as 키워드와 angle-bracket 문법이 있으며 JSX에서는 as 사용 필수
  • • 런타임 검증이 없어 잘못된 단언은 에러를 유발할 수 있음
Follow-up 질문

타입 단언 대신 타입 가드를 사용하는 것이 더 안전한 경우는 언제인가요?

2 비동기 처리
Medium

Q. 여러 개의 비동기 API 호출을 병렬로 처리해야 하는 상황에서 Promise.all, Promise.allSettled, Promise.race의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적합한지 설명해주세요.

A. 모범답안

Promise.all은 모든 프로미스가 성공할 때까지 기다리며, 하나라도 실패하면 즉시 reject됩니다. Promise.allSettled는 모든 프로미스의 성공/실패 여부와 관계없이 모든 결과를 반환합니다. Promise.race는 가장 먼저 완료되는 프로미스의 결과를 반환합니다. 모든 요청이 성공해야 하는 경우 Promise.all을, 일부 실패해도 다른 결과를 받아야 하는 경우 Promise.allSettled를, 타임아웃 구현이나 가장 빠른 응답만 필요한 경우 Promise.race를 사용합니다.

핵심 포인트
  • • Promise.all은 하나라도 실패하면 전체 실패
  • • Promise.allSettled는 모든 결과를 성공/실패 여부와 관계없이 반환
  • • Promise.race는 가장 먼저 완료되는 프로미스 결과 반환
Follow-up 질문

Promise.allSettled의 반환 타입은 어떻게 정의되며, 성공과 실패를 어떻게 구분할 수 있나요?

3 객체지향 프로그래밍
Medium

Q. TypeScript에서 추상 클래스(abstract class)와 인터페이스(interface)의 차이점을 설명하고, 각각을 언제 사용하는 것이 적합한지 실무 예시와 함께 설명해주세요.

A. 모범답안

추상 클래스는 구현부를 포함할 수 있고 생성자를 가질 수 있으며, 하나의 클래스만 상속 가능합니다. 인터페이스는 구현부 없이 타입 정의만 하며, 여러 개를 동시에 구현할 수 있습니다. 공통 로직이 있고 상속 계층이 명확한 경우(예: BaseRepository 클래스)는 추상 클래스를, 여러 클래스가 같은 구조를 따라야 하지만 구현이 완전히 다른 경우(예: Serializable, Loggable 인터페이스)는 인터페이스를 사용합니다. 추상 클래스는 JavaScript로 컴파일되지만 인터페이스는 컴파일 시 사라집니다.

핵심 포인트
  • • 추상 클래스는 구현부와 생성자 포함 가능, 단일 상속만 지원
  • • 인터페이스는 타입 정의만 가능, 다중 구현 지원
  • • 공통 로직이 있으면 추상 클래스, 구조만 강제하면 인터페이스 사용
Follow-up 질문

추상 클래스의 추상 메서드와 일반 메서드를 함께 사용하는 패턴의 장점은 무엇인가요?

4 에러 처리
Medium

Q. TypeScript에서 에러를 타입 안전하게 처리하기 위한 방법을 설명해주세요. 특히 Result 타입 패턴(Success/Failure)과 기존 try-catch 방식의 차이점, 그리고 각 방식의 장단점을 설명해주세요.

A. 모범답안

try-catch 방식은 JavaScript의 기본 에러 처리 방식으로 간단하지만, catch 블록의 에러 타입이 unknown이어서 타입 안정성이 떨어집니다. Result 타입 패턴은 성공과 실패를 명시적인 타입으로 표현하여(예: {success: true, data: T} | {success: false, error: E}) 컴파일 타임에 에러 처리를 강제하고 타입 안정성을 확보합니다. try-catch는 예외적인 상황에, Result 패턴은 예상 가능한 실패가 비즈니스 로직의 일부인 경우에 적합합니다. Result 패턴은 함수형 프로그래밍 스타일과 잘 어울리며, 에러 처리를 명시적으로 만들어 코드 가독성을 높입니다.

핵심 포인트
  • • try-catch는 간단하지만 에러 타입이 unknown으로 타입 안정성 부족
  • • Result 패턴은 성공/실패를 명시적 타입으로 표현하여 컴파일 타임 안정성 확보
  • • 예외적 상황은 try-catch, 예상 가능한 실패는 Result 패턴 사용
Follow-up 질문

Result 타입을 사용할 때 여러 비동기 작업을 체이닝하는 방법은 무엇인가요?

5 고급 타입
Hard

Q. TypeScript에서 Discriminated Union(구별된 유니온) 타입은 무엇이며, 어떻게 동작하나요? 실무에서 API 응답 타입을 정의할 때 이 패턴을 어떻게 활용할 수 있는지 설명해주세요.

A. 모범답안

Discriminated Union은 공통 속성(discriminant)을 가진 여러 타입의 유니온으로, 이 공통 속성 값으로 타입을 좁힐 수 있는 패턴입니다. 예를 들어 type 속성이 'loading', 'success', 'error'인 객체들의 유니온을 만들면, type 값을 체크하여 TypeScript가 자동으로 해당 타입의 다른 속성들을 추론합니다. API 응답에서 상태별로 다른 데이터 구조를 가질 때(로딩 중에는 데이터 없음, 성공 시 data 속성, 실패 시 error 속성) 이 패턴을 사용하면 타입 안정성을 확보하고 불가능한 상태 조합을 방지할 수 있습니다.

핵심 포인트
  • • 공통 리터럴 타입 속성(discriminant)으로 유니온 타입을 구별
  • • 공통 속성 값 체크로 TypeScript가 자동으로 타입 좁히기 수행
  • • 상태별로 다른 데이터 구조를 가질 때 타입 안정성 확보
Follow-up 질문

Discriminated Union에서 never 타입을 활용한 exhaustiveness checking은 무엇이며 왜 유용한가요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!