제네릭
클래스 또는 함수에서 사용할 타입을 사용할 때 결정하는 기법
-
클래스
클래스 정의 시 이름 뒤에 <T>를 표기한다. T는 관용적 표현
1class Model<T> {
2
3 private _data:T[] = [];
4
5 constructor(data:T[]=[]) {
6 this._data = data;
7 }
8
9 get data():T[] {
10 return this._data;
11 }
12
13 add(item:T):void {
14 this._data.push(item);
15 }
16}
-
함수
함수 정의 시 이름 뒤에 <T>를 표기한다.
1function pushItemArray<T>(arr:T[], item:T):void {
2 arr.push(item);
3}
4
5const potatoChip_materials = ['어니언'];
6
7pushItemArray<string>(potatoChip_materials, '사워크림');
-
함수 + 멀티 타입
1type pairArray = [any, any][]
2
3function pushPairItem<T, M>(arr: pairArray, item: [T, M]):pairArray {
4 arr.push(item)
5 return arr
6}
-
팩토리 함수 + 멀티 타입
1// 클래스 Model
2class Model {
3 constructor(public options:any) {}
4}
5
6// 팩토리 함수
7function create<T, U>( C: {new (U): T}, options: U ):T {
8 return new C(options);
9}
10
11// create() 팩토리 함수에 Model, string[] 멀티 타입 설정
12create<Model, string[]>(Model, ['class type']);
-
T는 Model
-
U는 string[]
-
C는 Model
-
{new (U): T}는 Model을 나타낸다.
{new (U): T}는 new (U) ⇒ T로도 쓸 수 있다.
이말은 constructor에 U타입을 넣어서 T 즉 모델을 반환
- new (U)는 Model 클래스 또는 constructor(U)
- 그거의 타입은 Model
-
타입 변수 상속
기존의 타입을 상속해서 제네릭할 수 있다.
1class Model<T>{
2 constructor(private _data: T[] = []){
3 }
4
5 add(item: T): void {
6 this._data.push(item)
7 }
8}
9
10// Model 초기화 팩토리 함수
11function initializeModel<T extends Model<U>, U>(C: new () => T, items:U[]): T {
12 const c = new C();
13 items.forEach(item => c.add(item))
14 return c
15}
16
17initializeModel<Model<string>, string>(Model, [’감’, ’우’, ’영’])
extends
상속 역할
1function add<T>(a: T, b:T){
2 return a + b // T + T는 연산되지 않는다.
3}
4
5function add<T extends Number>(a:T, b:T){
6 return a + b // 이제 a, b가 Number라는 것을 알 수 있다. Number타입만 들어갈 수 있다.
7}
제한조건으로 역할
1function printMessage<T extends string | number>(message: T){
2 return message // message의 타입으로 string 또는 number만 들어갈 수 있다.
3}
keyof
1function getItem<T, K extends keyof T>(object: T, key: K){
2 return object[key]
3}
4// key의 타입을 object에 속성값으로 제한할 수 있다.