일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- nextjs사용법
- SCSS extend
- vue mixin
- 리액트
- 프로그래머스 데브코스 프론트엔드
- SCSS import
- vuex map
- netlify redirect
- 프로그래머스 K_Digital Training
- 다른컴퓨터에서 git사용
- SCSS use
- Spacer
- vue 이벤트 수신
- 폼 입력 바인딩
- flex
- Vue
- vue 지역 컴포넌트
- 이벤트 수식어
- git 같은계정 다른 컴퓨터
- 프로그래머스 데브코스
- 리스트 렌더링
- 프로그래머스 프론트엔드 데브코스
- 고양이 사진 검색기
- KDT 프로그래머스
- intersection opserver
- KDT 프로그래머스 데브코스 프론트엔드
- react next
- postcss
- 쌓임맥락
- SCSS forward
- Today
- Total
혼자 적어보는 노트
[TypeScript] 제네릭(Generics) 본문
제네릭에 대해 알아보자.
제네릭(Generics)
제네릭은 재사용성이 높은 컴포넌트를 만들기 위해 활용된다.
아래와 같이 함수에 세부적인 타입을 미리 지정해버리면
해당 함수는 무조건 number값만 받아야 하고 재사용성이 떨어지게 된다.
function returnText(text: number): number{
return text;
}
다른 타입의 값도 받고 싶다면 any를 사용해야 하는데
any를 사용할 경우 함수의 인자로 어떤 타입이 전달되었는지 알 수 없고
어떤 값이 반환되는지 알 수 없다.
이 때 ✨제네릭을 사용해서 재사용성을 높일 수 있다.
제네릭 기본 문법
function returnText<T>(text: T): T{
return text;
}
returnText('Hello');
returnText(123);
위 처럼 제네릭 문법을 사용하면 사용자가 값을 전달할 때 어떤 타입인지 정할 수 있고
리턴받는 타입을 보장 받을 수 있다.
조금 더 명확하게 전달하려면 아래와와 같이 전달할 타입을 지정할 수 있다.
returnText<string>('Hello');
returnText<number>(123);
제네릭에 타입 지정
function returnText<T>(text: T): T{
console.log(text.length); // Error
return text;
}
전달할 인자가 배열이라는 가정하에 위 코드를 실행시키면 에러가 발생한다.
인자로 받은 text에 어떤 값이 들어오는지 컴파일 시점에선 알 수가 없기 때문에
length를 확인하려고 하면 에러가 발생하는 것이다.
아래와 같이 배열 타입을 지정해주면 에러없이 실행이 가능하다.
function returnText<T>(text: T[]): T[]{
console.log(text.length)
return text;
}
returnText(["Hello", 2, 3]);
위 부분은 아래와 같이 명시적으로 선언할 수도 있다.
returnText<T>(text: Array<T>): Array<T>
제네릭의 제약 조건
위의 코드처럼 배열 타입만을 전달 할 수 있게 지정해버리면
다른 데이터 타입에 length속성이 있더라도 전달이 되지 않는다는 문제점이 있다.
interface와 extends를 사용하여 length에 대해서 동작을 하는 인자만 넘겨 받을 수 있게 할 수 있다.
interface lengthWise{
length: number
}
function returnText<T extends lengthWise>(text: T): T{
console.log(text.length)
return text;
}
returnText(["Hello", 2, 3]);
returnText("Hello");
클래스에서의 제네릭
기본적으로 클래스에서의 제네릭은 아래와 같이 사용할 수 있다.
class Generic<T>{
constructor(private name:T){};
returnGeneric():T{
return this.name;
}
}
const generic = new Generic("Jay");
console.log(generic.returnGeneric()); // Jay
인터페이스와 함께 구현 시 아래와 같이 사용할 수 있다.
interface GenericReturnText<F,S> {
first: () => F;
second: () => S;
}
class ReturnText<F, S> implements GenericReturnText<F, S> {
constructor(private firstValue: F, private secondValue: S){};
first(): F{
return this.firstValue;
}
second() :S{
return this.secondValue;
}
}
const returnText:GenericReturnText<string, number> = new ReturnText("Hello", 2);
console.log(returnText.first());
console.log(returnText.second());
객체의 속성 제약
extends keyof를 사용하여 객체에 없는 속성에는 접근하지 못하게 제한할 수 있다.
const obj = {
name: 'Jay',
age: '22'
};
function getValue<T, K extends keyof T>(user: T, key: K): T[K]{
return user[key];
}
console.log(getValue(obj, 'name')) // Jay
console.log(getValue(obj, 'gender')) // Error
한번에 학습하려니 조금 복잡한 면이 있어서 응용을 잘 할 수 있을지는 모르겠지만,
이것 저것 혼자 만들어봐야 조금 더 감을 익힐 수 있을 것 같다.
참고:
https://academy.dream-coding.com/courses/typescript
'Typescript' 카테고리의 다른 글
[Typescript] Type Guard로 타입 좁히기 (0) | 2022.07.13 |
---|---|
[Typescript] React에서 Typescript 사용하기 (0) | 2022.05.24 |
[TypeScript] 인터페이스(interface) / Type과의 차이점 (0) | 2022.05.22 |
[TypeScript] enum / 타입추론 (0) | 2022.05.21 |
[TypeScript] 기본 타입 / 타입 별칭 / 유니온 타입 / 인터섹션타입 (0) | 2022.05.19 |