제네릭이란?
- 제네릭은 C#,Java 등의 언에서 재사용성이 높은 컴포넌트를 만들때 자주 활용된다.
- 한가지 타입보다 여러 가집 타입에서 동작하는 컴포넌트를 생성하는데 사용됨.
- 제네릭이란 타입을 마치 함수의 파라미터처럼 사용하는 것을 의미한다.
function getText(text) {
return text;
}
JS로 이러한 코드가 있을 때 인자로 'hi', 10, true를 각각 넣어준다면 함수는 그 값을 그대로 리턴해준다.
이를 TS의 제네릭 문법을 적용해본다면 아래처럼 정의한 후 재활용이 가능해진다.
// const getText = <T>(text:T):T =>{}
// const getText = <T = any>(text:T):T =>{}
// 위처럼 제네릭에 기본 타입도 줄 수 있다.
function getText<T>(text:T):T{
return text;
}
getText<string>('hi');
getText<number>(10);
getText<boolean>(true);
물론 위에 코드를 any를 사용해서 작성할 수 있다.
function logText(text:any):any{
return text;
}
하지만 이럴 경우 any는 타입 검사가 아니므로 인자가 어떤 타입인지, 어떤 타입이 리턴되는지 알 수 없다. (제네릭을 사용하는 이유) 제네릭을 이용한 뒤 호출하는 방식은 아래와 같다. (기본적으로 string 이라 생략하는듯?)
참고: https://lts0606.tistory.com/24
function logText<T>(text: T):T{
return text;
}
const text_1 = logText<string>("Hello Generic");
const text_2 = logText("Hello Generic");
인터페이스에 제네릭을 사용하는 방법은 아래와 같음
interface IValueCheck<T>{
value: T
}
let myValue : IValueCheck<string>{
value: 'data'
}
제네릭 타입 변수
function logText<T>(text:T):T {
console.log(text.length);
return text;
}
위와 같이 함수를 작성할 경우 해당 text에 .length가 있다는 단서는 어디에도 없어서 에러가 발생한다.
text에는 number가 들어갈 수도 있고 string이 들어 갈 수 있기 때문에 number가 들어갈 경우 .length가 유효하지 않기 때문
이것을 해결하는 방법으로는 아래 코드가 있다. ( 제네릭 타입이 배열이기 때문에 'length'가 허용됨)
function logText<T>(text:T[]):T[] {
console.log(text.length);
return text;
}
/**
명시적 선언
function logText<T>(text:Array<T>):Array<T> {
console.log(text.length);
return text;
}
*/
'FrontEnd > TypeScript' 카테고리의 다른 글
zod에 Data 형식 맞춰보기(feat. time) (0) | 2024.09.05 |
---|---|
[TS] 타입스크립트 Utility types - Exclude, Omit (0) | 2023.07.17 |
[TS] Cannot find module '' or its corresponding type declarations.ts(2307) (0) | 2023.02.26 |
[TypeScript] TS에서의 함수 ( 파라미터, 리턴 타입 지정 ) (0) | 2022.12.09 |
[TypeScript] declare module 에 대해 (feat. import, export ) (0) | 2022.12.09 |