Front-End

vsoghlv@naver.com

Typescript 연습(generics)

Genrtics 는 타입스크립트에서 함수, 클래스, TypeAlias, interface 를 사용할 때 여러 종류의 타입에 호환을 맞춰야 할 때 사용하는 문법이다.

<T> 보통 이런 식으로 사용한다.

먼저 함수에서의 사용법을 알아보자.

function merge(a: any, b: any) {
  return {
    ...a,
    ...b,
  };
}

const merged = merge({ foo: 1 }, { bar: 2 });

위와 같은 상황에서 제너릭스를 쓰지 않으면 a 와 b 에 정확히 뭘 넣어야 할 지 모른다. 이때 제네릭스를 사용해주면 된다.

function merge<T1, T2>(a: T1, b: T2) {
  return {
    ...a,
    ...b,
  };
}

const merged = merge({ foo: 1 }, { bar: 2 });

이제 merged. 해주면 vscode 에서 merged 안의 객체들을 보여주면서 뭘 넣어야 할지 유추할 수 있다.

쉽게 생각하면 any 를 사용한 경우 리턴값도 any 가 되어 유추하기가 힘들지만 제너릭스 사용한다면 그 타입이 지켜지면서 타입을 유추해낼수 있다.

interface 와 TypeAlias 에서도 비슷하게 사용한다.

interface Items<T> {
  list: T[];
}

//넣어준 타입대로 지정해줘야 한다.
const items: Items<string> = {
  list: ["a", "b"],
};

type Items2<T> = {
  list: T[];
};

const items2: Items2<number> = {
  list: [1, 2, 3],
};

//제너릭스는 여러개도 사용 가능하다.
interface Items<T, V> {
  list: T[];
  value: V;
}

//넣어준 타입대로 지정해줘야 한다.
const items: Items<string, number> = {
  list: ["a", "b"],
  value: 123,
};

클래스에서 사용하는 방법은 아래와 같이 사용하면 된다.

class Queue<T> {
  //T 로 이루어진 비율, 기본값 빈배열
  list: T[] = [];

  get length() {
    return this.list.length;
  }

  //Queue 에 새로운 것 등록
  enqueue(item: T) {
    //list 타입은 T[], item 은 T
    this.list.push(item);
  }

  //Queue 에서 첫번째 항목 추출
  dequeue() {
    return this.list.shift();
  }
}

const queue = new Queue();
queue.enqueue(0);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);

while (queue.length > 0) {
  console.log(queue.dequeue());
  //0
  //1
  //2
  //3
  //4
}