Github
Poststypescripttypescript generic

typescript generic

TypeScript 제네릭의 개념과 클래스, 함수, 팩토리 함수에서의 활용 방법

제네릭

클래스 또는 함수에서 사용할 타입을 사용할 때 결정하는 기법

  1. 클래스

    클래스 정의 시 이름 뒤에 <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}
  2. 함수

    함수 정의 시 이름 뒤에 <T>를 표기한다.

    1function pushItemArray<T>(arr:T[], item:T):void { 2 arr.push(item); 3} 4 5const potatoChip_materials = ['어니언']; 6 7pushItemArray<string>(potatoChip_materials, '사워크림');
  3. 함수 + 멀티 타입

    1type pairArray = [any, any][] 2 3function pushPairItem<T, M>(arr: pairArray, item: [T, M]):pairArray { 4 arr.push(item) 5 return arr 6}
  4. 팩토리 함수 + 멀티 타입

    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']);
  5. T는 Model

  6. U는 string[]

  7. C는 Model

  8. {new (U): T}는 Model을 나타낸다.

    {new (U): T}는 new (U) ⇒ T로도 쓸 수 있다.

    이말은 constructor에 U타입을 넣어서 T 즉 모델을 반환

    1. new (U)는 Model 클래스 또는 constructor(U)
    2. 그거의 타입은 Model
  9. 타입 변수 상속

    기존의 타입을 상속해서 제네릭할 수 있다.

    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에 속성값으로 제한할 수 있다.