TypeScript(3)

새벽로즈·2023년 12월 14일
0

TIL

목록 보기
61/72
post-thumbnail

enum

  • 열거형 데이터 타입으로 상수 값을 그룹화하는 데 적합

enum 장점

  • 가독성 향상 및 명확한 상수 값 정의

  • 컴파일 시 자동 숫자 매핑, 필요 시 직접 할당 가능

    enum UserRole {
      ADMIN = "ADMIN",
      EDITOR = "EDITOR",
      USER = "USER",
    }
    
    enum UserLevel {
      NOT_OPERATOR, // 0
      OPERATOR, // 1
    }
    
    function checkPermission(userRole: UserRole, userLevel: UserLevel): void {
      // ...
    }
    
    const userRole: UserRole = UserRole.EDITOR;
    const userLevel: UserLevel = UserLevel.NOT_OPERATOR;
    checkPermission(userRole, userLevel);

object literal(객체 리터럴)

키-값 쌍으로 구성된 객체를 정의. enum과 유사하지만 'const'나 'let' 키워드 사용 가능.

object literal 장점

  • 다양한 데이터 타입과 유연한 구조 지원
  • 런타임 에러 방지
   const obj = {
     a: [1, 2, 3],
     b: 'b',
     c: 4
   };

enum과 object literal의 선택 기준

  1. 'enum' 사용:
  • 간단한 상수 값을 그룹화할 때
  • 각 멤버의 값이 변경되면 안 될 때
  1. 객체 리터럴 사용
  • 복잡한 구조와 다양한 데이터 타입이 필요할 때

유틸리티타입 1. Partial

타입 'T'의 모든 속성을 선택적으로 만들어 객체 생성 용이

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

   const updatePerson = (person: Person, fields: Partial<Person>): Person => {
     // ...
   };

   const person: Person = { name: "Spartan", age: 30 };
   const changedPerson = updatePerson(person, { age: 31 });

유틸리티타입 2. Required

타입 'T'의 모든 속성을 필수로 만듬

  interface Person {
    name: string;
    age: number;
    address?: string;
  }

  type RequiredPerson = Required<Person>;

유틸리티타입 3. Readonly

타입 'T'의 모든 속성을 읽기 전용으로 만듬

   interface DatabaseConfig {
     host: string;
     readonly port: number;
   }

   const immutableConfig: Readonly<DatabaseConfig> = {
     // ...
   };

유틸리티타입 4. Pick<T, K>

타입 'T'에서 일부 속성만 선택하여 새 타입 생성

   interface Person {
     name: string;
     age: number;
     address: string;
   }

   type SubsetPerson = Pick<Person, "name" | "age">;

유틸리티타입 5. Omit<T, K>

타입 'T'에서 일부 속성을 제외한 새 타입 생성

   interface Person {
     name: string;
     age: number;
     address: string;
   }

   type SubsetPerson = Omit<Person, "address">;

클래스와 객체

  • 클래스: 객체 지향 프로그래밍(OOP)의 핵심 구성 요소, 객체를 만들기 위한 틀(template)
  • 객체: 클래스를 기반으로 생성된 인스턴스

###클래스 정의하기

  • TypeScript에서는 'class' 키워드 사용
  • 클래스의 속성과 메서드 정의
  • 생성자('constructor')로 객체 초기화
  • 접근 제한자(public, private, protected) 사용

상속

  • 클래스 간의 관계를 정의하는 OOP의 개념
  • 기존 클래스의 속성과 메서드를 물려받아 새로운 클래스 정의
  • 'extends' 키워드 사용

서브타입, 슈퍼타입

  • 서브타입: A가 B의 서브타입이면 B가 필요한 곳에 A를 사용 가능
  • 슈퍼타입: B가 A의 슈퍼타입이면 A가 필요한 곳에 B를 사용 가능

upcasting, downcasting

  • upcasting: 서브타입 → 슈퍼타입으로 변환. 암시적으로 이루어짐
  • downcasting: 슈퍼타입 → 서브타입으로 변환. 명시적으로 타입 변환 필요

추상 클래스

  • 인스턴스화 불가능한 클래스
  • 자식 클래스에서 메서드를 강제로 구현하기 위해 사용
  • 'abstract' 키워드 사용

인터페이스

  • 객체의 타입을 정의하는 TypeScript의 기능
  • 객체가 가져야 하는 속성과 메서드를 정의
  • 인터페이스를 구현한 객체는 인터페이스를 준수해야 함
  • 구현부를 제공하지 않음

추상 클래스와 인터페이스의 차이

  • 구현부 제공 여부: 추상 클래스는 기본 구현 제공, 인터페이스는 구현부 제공하지 않음
  • 상속 메커니즘: 추상 클래스는 단일 상속, 인터페이스는 다중 상속 가능

객체 지향 설계 원칙 - S.O.L.I.D

  1. S(SRP. 단일 책임 원칙)
  • 클래스는 하나의 책임만 가져야 함
  1. O(OCP. 개방 폐쇄 원칙)
  • 클래스는 확장에 대해서는 열려 있고, 수정에 대해서는 닫혀 있어야 함
  • 인터페이스나 상속을 통해 기능을 확장할 수 있음
  1. L(LSP. 리스코프 치환 원칙)
  • 서브타입은 슈퍼타입을 대체할 수 있어야 함
  • 자식 클래스는 부모 클래스와 호환되어야 함
  1. I(ISP. 인터페이스 분리 원칙)
  • 클래스는 자신이 사용하지 않는 인터페이스의 영향을 받지 않아야 함
  • 필요한 인터페이스만 구현
  1. D(DIP. 의존성 역전 원칙)
  • 상위 수준 모듈에 의존해야 함
  • 하위 수준 모듈이 아닌 추상화된 상위 수준에 의존

오늘의 한줄평 : 이론은 언제나 어렵다... 그렇지만 노력해야지!

profile
귀여운 걸 좋아하고 흥미가 있으면 불타오릅니다💙 최근엔 코딩이 흥미가 많아요🥰

0개의 댓글