TypeScript - Generics


Generics
Genericsは、typescriptで関数、クラス、インタフェース、typealiasを使用する場合に、複数のタイプを互換化する必要がある場合に使用される構文です.<T>というのがGenericsです.
//function의 파라미터에 a,b에 들어오는 값이 정해져 있지 않는 경우 generics를 쓰게된다.
function merge (a: any, b: any) {
  return{
    ...a,
    ...b,
  };
}

const merged = merge({foo: 1}, {bar: 2});
// generics를 사용하면
function merge<T1, T2> (a: T1, b: T2) {
  return{
    ...a,
    ...b,
  };
}

const merged = merge({foo: 1}, {bar: 2});
merged./*라고 하면 안에 foo와 bar가 들어있는 것을 볼 수 있다.*/
このように汎用型を用いると,実際のパラメータに加わるタイプが類推である.
Ex 2)その他の使用状況
functino wrap <T> (param: T) {
  return{
    param
  };
}

const wrapped = wrap(10);

wrapped./*이렇게 하면 위에 wrap()안에 넣는 값에 따라 타입이 지켜지면서 어떤 형태인지 알 수 있다.*/
インタフェースやtypealiasでも使用できます.
interface Items<T> {
  list: T[]
};

const items: Items <string> = {
  list: ['a', 'b', 'c']/*list가 위에서 string을 넣어줬기 때문에 string을 넣어줘야 한다. 즉 number을 넣어주게 되면 number를 넣어야 한다.*/
};

//typealias로 구현
type Items<T> = {
  list: T[];
};

const items: Items <string> = {
  list: ['a', 'b', 'c']
};
//Generics는 여러개여도 상관없다.
type Items<T, V> = {
  list: T[];
  value: V[];
};

const items: Items <string, number> = {
  list: ['a', 'b', 'c'],
  Value: [1, 2, 3]
};
Ex 4)クラスでGenericsを使用する方法
class Queue<T> {
  list : T[] = [];

  get length() {
    return this.list.length;
  }
  enqueue(item: T) {
    this.list.push(item);
  }
  
  dequeue() {
    return this.list.shift();
  }
}

const queue = new Queue<number>();

queue.enqueue(0);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);

while (enqueue.length > 0) {
  console.log(queue.dequeue());
}
Qはデータを登録できる資料型であり,先に登録を抽出することができる.
  • enqueue:Q新規登録.
  • dequeue:Qの最初の項目.