6주차 TypeScript Study 에서는 클래스와 제네릭에 대해 배웠습니다
스터디 내용을 복습하면서 핵심 내용을 더 쉽게 정리해보았습니다
클래스 몸체
에 클래스 프로퍼티
를 선언할 수 없고 반드시 생성자 내부
에서 클래스 프로퍼티
를 선언하고 초기화
// person.js
class Person {
constructor(name) {
// 클래스 프로퍼티의 선언과 초기화
this.name = name;
}
walk() {
console.log(`${this.name} is walking.`);
}
}
클래스 몸체
에 클래스 프로퍼티
를 사전 선언
// person.ts
class Person {
// 클래스 프로퍼티를 사전 선언하여야 한다
name: string;
constructor(name: string) {
// 클래스 프로퍼티수에 값을 할당
this.name = name;
}
walk() {
console.log(`${this.name} is walking.`);
}
}
접근 제한자를 명시하지 않았을 때
다른 클래스 기반 언어의 경우 : 암묵적으로 protected
로 지정
TypeScript의 경우 : 접근 제한자를 생략한 클래스 프로퍼티와 메소드는 암묵적으로 public
이 선언
따라서 public
으로 지정하고자 하는 멤버 변수와 메소드는 접근 제한자를 생략
접근 가능성 | public | protected | private |
---|---|---|---|
클래스 내부 | ◯ | ◯ | ◯ |
자식 클래스 내부 | ◯ | ◯ | ✕ |
클래스 인스턴스 | ◯ | ✕ | ✕ |
데이터의 타입을 일반화
한다(generalize)한다는 것을 뜻한다
즉, 제네릭은 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하는 기법
function printInfo<T>(info: T): T {
console.log(info);
return info;
}
printInfo<number>(10);
printInfo<string>('하이');
printInfo<boolean>(true);
T
는 제네릭을 선언할 때 관용적으로 사용되는 식별자로 타입 파라미터
(Type parameter)라 한다
정적 타입 언어의 경우 : 함수 또는 클래스를 정의하는 시점
에 매개변수나 반환값의 타입을 선언
TypeScript 또한 정적 타입 언어이기 때문에 함수 또는 클래스를 정의하는 시점
에 매개변수나 반환값의 타입을 선언
해야 한다
그런데 함수 또는 클래스를 정의하는 시점에 매개변수나 반환값의 타입을 선언하기 어려운 경우가 있기 때문에 제네릭을 사용한다
원하지 않는 속성에 접근하는 것을 막기 위해 제네릭에 제약조건을 사용
특정 타입들로만 동작하는 제네릭 함수를 만들 때 사용, 제약 조건을 벗어나는 타입을 선언하면 에러가 발생
const printMessage = <T extends string | number>(message: T):T => {
return message;
}
printMessage<string>("1");
printMessage<number>(1);
printMessage<boolean>(false); // error : Type 'boolean' does not satisfy the constraint 'string | number'.
extends
키워드로 제약조건을 걸어준다정의한 인터페이스에 있는 key값만을 인자로 전달받겠다고 함수를 제약
interface FoodCart {
name: string;
price: number;
quantity: number;
}
function getFoodCartOption<T extends keyof FoodCart>(foodOption: T): T {
return foodOption;
}
getFoodCartOption<string>('a'); // 에러 발생
접근제한자 접근제한성을 진짜 너무 깔끔하게 정리해줬네요!!! 저한테는 제네릭 개념이 조금 복잡하게 느껴졌는데, extends 랑 keyof 같은 키워드로 제네릭에 넘길 타입을 제약해주는 부분을 정말 쉽게 정리해줘서 제대로 복습해볼 수 있었어요!! 👍