제네릭(제네릭 타입)은 다양한 타입으로 작동하면서도 엄격한 타입 안전성을 유지하는 일반적인 코드를 작성할 수 있게 해줍니다.
사용 구문:
function identity<T>(value: T): T { return value; } const x = identity<string>('test'); // T = string
적용 영역:
타입 제한이 있는 예:
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[]를 반환했으며, 제네릭이 명시되지 않아 타입스크립트가 타입을 추론할 수 없었습니다. 오류는 프로덕션에서만 감지되었습니다.
이야기
초보 개발자가 타입 제한 없이 제네릭 클래스를 생성했으며, 모든 타입에서 존재하지 않는 필드를 사용했습니다. 컴파일러는 경고하지 않았지만, 존재하지 않는 속성에 접근할 때 모든 기능이 깨졌습니다.