[TypeScript] Generics(2)

haryun·2022년 9월 11일
0

TypeScript

목록 보기
6/6
post-thumbnail

패스트캠퍼스 TypeScript 강의 Ch 7. Generics 복습 내용
참고링크

📕 Generics 정리

📌 Generic class

class Person<T> {
  private _name: T;
  constructor(name: T) {
    this._name = name;
  }
}

new Person('Haryun'); // <string>
new Person<string>(30); // error

인스턴스 생성시 제네릭을 별도로 지정하지 않으면 매개변수에 의해 추론되며, 직접 지정시 매개변수 값은 타입을 일치시켜야 한다.
(즉, 제네릭을 사용하면 컴파일 타임에 타입 에러를 체크할 수 있다.)

📌 Generic extends

class PersonExtends<T extends string | number> { // T를 유니온타입으로 지정하여 제네릭 타입에 제한을 둠
  private _name: T;

  constructor(name: T) {
    this._name = name;
  }
}

new PersonExtends('Harin');
new PersonExtends(100);
new PersonExtends(true); // error

타입은 항상 가장 작은 범위로 추론할 수 있도록 제한해주는 것이 컴파일 오류를 줄일 수 있는 방법이다.
(제네릭에서의 extends는 확장보다는 제한의 의미로 해석하는 것이 이해가 쉬울듯 하다..)

📌 keyof

keyof 키워드를 사용하면 오브젝트의 key 값을 문자열로 얻을 수 있다.

이렇게만 보면 딱히 어디에 사용해야하는지 감이 오지 않지만.. keyof를 사용하면 해당 제네릭 타입의 값을 클래스 멤버로 지정할 수 있다는 뜻이 된다.
(타입을 명확하게 추론, 정의 할 수 있음)

interface IPerson {
  name: string;
  age: number;
} 

const person: IPerson = {
  name: 'Harin',
  age: 23
};

type Keys = keyof IPerson; // 타입 앨리어스를 통해 keyof 키워드를 지정

코드로 확인해 보기 👇

function getProp(obj: IPerson, key: 'name' | 'age'): string | number {
	return obj[key];
}
// 위의 함수를 아래와 같이 사용할 수 있다
function getProp<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

getProp(person, 'age'); // 'name' 또는 'age'의 유니온 타입

fucntion setProp(obj: IPerson, key: 'name' | 'age', value: string | number): void {
	obj[key] = value;
}
// 위의 함수를 아래와 같이 사용할 수 있다
function setProp<T, K extends keyof T>(obj: T, key: keyof T, value: T[K]): void {
  obj[key] = value;
}
setProp(person, 'name', 'Haryun');

0개의 댓글