프로그래밍백엔드 개발자

타입스크립트의 제네릭 타입화란 무엇인가? 이를 사용하여 일반적인 함수와 클래스를 작성하는 방법은 무엇인가? 어떤 함정이 있을 수 있는가?

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

답변.

제네릭(제네릭 타입)은 다양한 타입으로 작동하면서도 엄격한 타입 안전성을 유지하는 일반적인 코드를 작성할 수 있게 해줍니다.

사용 구문:

function identity<T>(value: T): T { return value; } const x = identity<string>('test'); // T = string

적용 영역:

  • 컬렉션의 일반적인 함수 (map, filter 등)
  • 클래스 (예: Repository<Entity>)
  • 인터페이스 (예: 일반 타입의 API 응답)

타입 제한이 있는 예:

function getFirst<T extends { length: number }>(arr: T): T { return arr[0]; }

역설적인 질문.

질문: 제네릭 파라미터를 가진 함수를 호출할 때 반드시 구체적인 타입을 지정해야 하는가?

답변:

반드시 그럴 필요는 없습니다. 타입스크립트는 가능하면 전달된 값에 따라 타입을 추론합니다. 그러나 때때로 명시적으로 지정하는 것이 편리합니다. 예를 들어, 전달된 값으로부터 타입이 불확실하거나 여러 가지 옵션이 있을 경우입니다.

function identity<T>(value: T): T { return value; } identity(5); // T = number (자동) identity<string>('s'); // T = string (명시적)

주제의 미세한 차이를 몰라 발생한 실수 사례.


이야기

전자 상거래 프로젝트에서 다양한 엔티티를 위한 제네릭 레포지토리를 작성했지만 타입 제한을 잊었습니다. 그 결과 제네릭에 잘못된 객체가 들어갈 수 있었고, 한번은 호환되지 않는 필드를 가진 엔티티를 저장했습니다. 타입이 오류를 방지하지 못했습니다.


이야기

템플릿 함수를 배열에 전달했으며, 요소의 타입을 가진 배열을 얻기를 기대했습니다. 그러나 함수는 any[]를 반환했으며, 제네릭이 명시되지 않아 타입스크립트가 타입을 추론할 수 없었습니다. 오류는 프로덕션에서만 감지되었습니다.


이야기

초보 개발자가 타입 제한 없이 제네릭 클래스를 생성했으며, 모든 타입에서 존재하지 않는 필드를 사용했습니다. 컴파일러는 경고하지 않았지만, 존재하지 않는 속성에 접근할 때 모든 기능이 깨졌습니다.