home
자바
home
🍒

제네릭

강의명
타입스크립트 입문 - 기초부터 실전까지
강의순서
10
과목
⚾타입스크립트
수강상태
완료

제네릭(Generics)의 사전적 정의

C#, Java 등의 언어에서 재사용성이 높은 컴포넌트를 만들 때 자주 활용되는 특징이다.
한가지 타입보다 여러 가지 타입에서 동작하는 컴포넌트를 생성하는데 사용된다.

예시

제네릭이란 타입을 마치 함수의 파라미터처럼 사용하는 것을 의미한다.
function getText(text) { return text; } // hi, 10, true 등 어떤 값이 들어가더라도 그대로 반환한다. getText('hi'); // 'hi' getText(10); // 10 getText(true); // true
TypeScript
복사
함수를 호출할 때 아래와 같이 함수 안에서 사용할 타입을 넘겨줄 수 있다.
function getText<T>(text: T): T { return text; } getText<string>('hi'); // 'hi' getText<number>(10); // 10 getText<boolean>(true); // true
TypeScript
복사
제네릭 기본 문법이 적용된 형태

기존 타입 정의 방식과 제네릭의 차이점 - 함수 중복 선언의 단점

function logText(text: string) { console.log(text); return text; } function logNumber(num: number) { console.log(num); return num; }
TypeScript
복사
단순히 타입을 다르게 받기 위해 중복되는 코드들을 계속해서 생성하게 되면 유지보수 관점에서 좋지 않다.

기존 문법과 제네릭의 차이점 - 유니온 타입을 이용한 선언 방식의 문제

input에 대한 문제는 없지만 반환값에 대해서는 문제가 있다.
function logText(text: string | number) { console.log(text); // string과 number가 공통으로 접근할 수 있는 속성이나 API에 대해서만 자동완성으로 보여진다. return text; } const a = logText('a'); a.split(''); // error 문자열 'a'를 파라미터로 넘겨주었지만 리턴타입은 여전히 string|number logText(10);
TypeScript
복사

제네릭 장점과 타입 추론에서의 이점

// 함수를 정의할 때 타입을 정의하는 것이 아니라 // 함수를 호출하는 시점에 정의한다. function logText<T>(text: T): T { console.log(text); return text; } const str = logText<string>('abc'); str.split(''); const login = logText<boolean>(true);
TypeScript
복사

제네릭의 타입 제한

function logTextLength<T>(text: T[]): T[] { console.log(text.length); text.forEach(function(text) { console.log(text); }); return text; } logTextLength<string>(['hi', 'abc']);
TypeScript
복사

정의된 타입으로 타입 제한하기

interface LengthType { length: number; } function logTextLength<T extends LengthType>(text: T): T { text.length; return text; } logTextLength(10); // error logTextLength({ leng: 10 }); // error
TypeScript
복사

keyof로 제네릭의 타입 제한하기

interface ShoppingItem { name: string; price: number; stock: number; } function getShoppingItemOption<T extends keyof ShoppingItem>(itemOption: T): T { return itemOption; } // getShoppingItemOption(10); // getShoppingItemOption<string>('a'); getShoppingItemOption('name');
TypeScript
복사