-
[Generic]제네릭 함수TypeScript 2023. 6. 6. 15:24
제네릭은 C#,JAVA같은 언어에서 재사용 가능한 컴포넌트를 생성하는 도구로 사용된다.
Generic은 타입의 generalize(일반화)하는 방법을 제공한다.
타입스크립트에서도 이 제네릭을 사용하여 다양한 타입을 갖는 함수,클래스,인터페이스 등을 만들 수 있다.
모든 타입을 받을 수 있는 any타입과 비교하여 제네릭을 사용해야하는 이유를 알아보려고한다.
제네릭 함수 만들기
function identify(arg:number):number{ return arg; } function identify(arg:any):any{ return arg; }
이렇게 number와 any타입을 반환하는 함수가 있다.
any타입은 어떤 타입이든 받을 수 있지만 함수가 반환할 때 어떤 타입인지 정보를 잃게된다.
어떤 타입을 넣어도 any로 타입이 반환되고 있다.
이것을 제네릭 타입으로 변경해 보았다. 제네릭 타입은 <T>(arg : T):T형식으로 사용하는데 일반적으로 Type의 T를 사용한다.
function identify<T>(arg:T){ return arg; }
any를 쓰는것과 다르게 정확한 타입을 얻을 수 있다.
any타입은 모든 타입을 포함할 수 있기 때문에 타입 체크를 우회하는 효과가 있다.
그래서 안정성이 떨어지고 컴파일러가 타입 검사를 수행하지 않으므로 런타임 시 에러가 발생할 수 있다.
타입 검사를 하지 않기때문에 any타입에 일반 숫자를 매개변수로 보내고 length를 리턴하게 된다면 아무런 에러가 발생하지 않는다.
하지만 제네릭 타입은 length속성이 없다고 에러를 표시를 해준다.
에러를 없애려면 제약조건(Constraint)을 추가해서 특정 조건을 만족하는 타입만을 제네릭으로 사용할 수 있도록 제한할 수 있다.
//1.[]을 추가 function identify<T>(arg: T[]) { return arg.length; } //2. extends를 사용 interface Lengthy { length: number; } function identify<T extends Lengthy>(arg: T) { return arg.length; }
이렇게 length:number 프로퍼티를 가진 타입만 올 수 있도록 설정을 하였다.
제약 조건을 설정하여 특정 프로퍼티나 메서드가 존재해야 하는 경우 이를 보장할 수 있게 해준다.
any타입보다는 제네릭 타입을 사용하여 타입의 안정성을 유지하는것이 좋다.
'TypeScript' 카테고리의 다른 글
[TS기초]객체 타입 (0) 2023.06.15 [TS기초]기본 타입 (0) 2023.06.13 대수 타입 (0) 2023.06.11 Type Casting(타입 형변환) (0) 2023.06.05 인터프리터 언어, 컴파일 언어 (0) 2023.05.29