TypeScriptSTUDY _ 3장 . 고급타입 [ 3.3 제네릭 사용법 ]

zeroha·2024년 11월 25일
0

TypeScriptStudy

목록 보기
8/32
post-thumbnail

1. 함수의 제네릭

어떤 함수의 매개변수나 반환 값에 다양한 타입을 넣고 싶을 때 -> 제네릭 사용

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 작업을 수행하는 데 사용


2. 호출 시그니처의 제네릭

호출 시그니처 call signature : 타입스크립트의 함수 타입 문법으로 함수의 매개변수와 변환 타입을 미리 선언하는 것.

개발자는 함수 호출 시 필요한 타입을 별도로 지정
: 제네릭 타입을 어디에 위치시키는지 -> 타입의 범위와 제네릭 타입을 언제 구체 타입으로 한정할지 결정 가능


3. 제네릭 클래스

: 외부에서 입력된 타입을 클래스 내부에 적용할 수 있는 클래스

클래스 이름 뒤에 타입 매개 변수인 <T> 선언
-> <T>는 메서드의 매개변수나 반환 타입으로 사용 가능

제네릭 클래스를 사용하면 클래스 전체에 걸쳐 타입 매개변수가 적용
-> 특정 메서드만을 대상으로 제네릭을 적용하려면 해당 메서드를 제네릭 메서드로 선언하면 된다.


4. 제한된 제네릭

: 타입스크립트에서 제한된 제네릭은 타입 매개변수에 대해 제약 조건을 설정하는 기능

예) string 타입 제약 -> 타입 매개변수는 특정타입을 상속 extends 해야 함.

type ErrorRecord <Key extends string> = Exclude<Key, ErrorCodeType> extends never 
? Partial <Record <Key, boolean>>
: never;

타입 매개변수가 특정타입으로 묶였을 ( bind ) 때,
키를 바운드 타입 매개변수 bounded type parameters라고 함.
그리고 string을 키의 상한 한계( upper bound )라고 함.

상속받을 수 있는 타입 : 기본 타입 +// (상황에 따라) 인터페이스 + 클래스 + 유니온 타입


5. 확장된 제네릭

제네릭 타입은 여러 타입을 상속 받을 수 있으며 타입 매개변수를 여러 개 들 수 있음.
타입 제약 -> 유연성 잃을 가능성 o
-> 그렴 유니온 타입을 상속해서 선언하면 됨.
: 유니온 타입으로 T가 여러 타입을 받게 할 수 있지만, 타입 매개변수가 여러 개일 때는 처리x -> 이럴 때는 매개변수를 하나 더 추가하여 선언


6. 제네릭 예시

제네릭의 장점 : 다양한 타입 받게 함. > 코드의 재사용성 o
-> 실제 현업 : API 응답 값의 타입을 지정할 때 많이 씀. > 가독성 o

주의 ) 굳이 필요하지 않은 곳까지 쓰면 코드 복잡해짐.

  • 제네릭을 굳이 사용하지 않아도 되는 타입

  • any 사용하기
    any 사용 -> 제네릭의 장점과 타입 추론 및 타입검사 x

  • 가독성을 고려하지 않은 사용
    : 제네릭이 과도하게 사용되면 가독성을 해침
    -> 복잡한 제네릭은 의미 단위로 분할해서 사용하기


    _ 도서참조 : 우아한 타입스크립트 with 리액트

profile
하 영

0개의 댓글

관련 채용 정보