어떤 함수의 매개변수나 반환 값에 다양한 타입을 넣고 싶을 때 -> 제네릭 사용
function ReadOnlyRepository<T>(target: ObjectType<T> | EntitySchema<T> | string):
Repository<T> {
return getConnection ("ro").getRepository (target);
}
제네릭 타입 :
이 함수는 제네릭을 사용하여 어떤 엔티티 타입에 대해서도 동작하도록 설계됨.
T = 엔티티의 타입
target 매개변수:
ObjectType | EntitySchema | string 타입을 받을 수 있음.
ObjectType: TypeORM에서 엔티티 클래스의 타입입니다.
EntitySchema: TypeORM의 스키마 기반 엔티티 타입.
string: 엔티티 이름을 문자열로 전달하는 경우.
getConnection("ro"):
"ro"라는 이름의 연결을 가져옴.
"ro" : 보통 읽기 전용 데이터베이스 연결을 의미
예를 들어, 마스터-슬레이브 구조에서 슬레이브 데이터베이스에 연결할 때 사용
getRepository(target):
TypeORM의 저장소(Repository)를 반환 -> 이 저장소는 엔티티(target)에 대해 CRUD 작업을 수행하는 데 사용
호출 시그니처 call signature : 타입스크립트의 함수 타입 문법으로 함수의 매개변수와 변환 타입을 미리 선언하는 것.
개발자는 함수 호출 시 필요한 타입을 별도로 지정
: 제네릭 타입을 어디에 위치시키는지 -> 타입의 범위와 제네릭 타입을 언제 구체 타입으로 한정할지 결정 가능
: 외부에서 입력된 타입을 클래스 내부에 적용할 수 있는 클래스
클래스 이름 뒤에 타입 매개 변수인 <T>
선언
-> <T>
는 메서드의 매개변수나 반환 타입으로 사용 가능
제네릭 클래스를 사용하면 클래스 전체에 걸쳐 타입 매개변수가 적용
-> 특정 메서드만을 대상으로 제네릭을 적용하려면 해당 메서드를 제네릭 메서드로 선언하면 된다.
: 타입스크립트에서 제한된 제네릭은 타입 매개변수에 대해 제약 조건을 설정하는 기능
예) string 타입 제약 -> 타입 매개변수는 특정타입을 상속 extends 해야 함.
type ErrorRecord <Key extends string> = Exclude<Key, ErrorCodeType> extends never
? Partial <Record <Key, boolean>>
: never;
타입 매개변수가 특정타입으로 묶였을 ( bind ) 때,
키를 바운드 타입 매개변수 bounded type parameters라고 함.
그리고 string을 키의 상한 한계( upper bound )라고 함.
상속받을 수 있는 타입 : 기본 타입 +// (상황에 따라) 인터페이스 + 클래스 + 유니온 타입
제네릭 타입은 여러 타입을 상속 받을 수 있으며 타입 매개변수를 여러 개 들 수 있음.
타입 제약 -> 유연성 잃을 가능성 o
-> 그렴 유니온 타입을 상속해서 선언하면 됨.
: 유니온 타입으로 T가 여러 타입을 받게 할 수 있지만, 타입 매개변수가 여러 개일 때는 처리x -> 이럴 때는 매개변수를 하나 더 추가하여 선언
제네릭의 장점 : 다양한 타입 받게 함. > 코드의 재사용성 o
-> 실제 현업 : API 응답 값의 타입을 지정할 때 많이 씀. > 가독성 o
주의 ) 굳이 필요하지 않은 곳까지 쓰면 코드 복잡해짐.
제네릭을 굳이 사용하지 않아도 되는 타입
any 사용하기
any 사용 -> 제네릭의 장점과 타입 추론 및 타입검사 x
가독성을 고려하지 않은 사용
: 제네릭이 과도하게 사용되면 가독성을 해침
-> 복잡한 제네릭은 의미 단위로 분할해서 사용하기
_ 도서참조 : 우아한 타입스크립트 with 리액트