[TS] 데이터무결성과 타입가드

단비·2023년 3월 9일
0

인강

목록 보기
8/15
  • 인터페이스로 설계하기
    • 인터페이스

      // 인터페이스의 경우 앞에 I를 붙여주는게 보기 좋음
      export interface ICalculator {
          add(a: number, b: number): number;
      
          minus(a: number, b: number): number;
      
          multiple(a: number, b: number): number;
      
          divide(a: number, b: number): number;
      }
      import { ICalculator } from "./cal";
      
      // 인터페이스를 구현한 클래스명의 뒤엔 Imp
      export class CalculatorImplV1 implements ICalculator {
          add(a: number, b: number): number {
              return a + b;
          }
      
          minus(a: number, b: number): number {
              return a - b;
          }
      
          multiple(a: number, b: number): number {
              return a * b;
          }
      }
    • 메인

      import { ICalculator } from "./cal";
      import { CalculatorImplV1 } from "./calImpl.v1";
      
      // 타입은 인터페이스, 생성자는 클래스로 하여 의존성을 낮춤
      const cal: ICalculator = new CalculatorImplV1();
      console.log(cal.add(1, 2));

  • 함수는 객체
    1. new를 이용한 함수 선언이 가능함

      const add1: Function = new Function("a", "b", "return a + 2 * b");
    2. 인터페이스를 타입으로 설정 가능함

      interface ADD2 {
          (a: number, b: number): number;
      }
      const add2: ADD2 = function ADD2(a: number, b: number): number {
          return a + b;
      };

  • 데이터 무결성
    • Proxy
      - 객체의 속성 가져오기, 설정 및 정의와 같은 기본 객체 작업을 재정의할 수 있음
      - 프록시 객체는 일반적으로 속성 액세스를 기록하고, 입력의 유효성을 검사하고, 형식을 지정하거나, 삭제하는 데 사용
      - 매개변수
      - target: 프록시할 원본 객체
      - handler: 가로채는 작업과 가로채는 작업을 재정의하는 방법을 정의하는 객체
      - handler의 get, set
      - get
      - target: 대상 객체
      - property: 가져올 속성의 이름 또는 Symbol
      - receiver: 프록시 또는 프록시에서 상속되는 객체
      - set
      - target: 대상 객체
      - property: 설정할 속성의 이름 또는 Symbol
      - value: 설정할 속성의 새 값
      - receiver: 할당이 지시된 원래 객체

      interface ICar {
          name: string;
          speed: number;
      }
      const car = { speed: 0, name: "" };
      
      const carProxy: ICar = new Proxy<ICar>(car, {
          get(target: ICar, p: keyof ICar) {
          console.log("get", target, p);
          return target[p];
          },
          set(target: ICar, p: keyof ICar, newValue: any) {
          console.log("set", target, p, newValue);
          if (p === "speed") target.speed = newValue > 0 ? newValue : 0;
          return true;
          },
      });
      
      carProxy.speed = 30;
      console.log(carProxy.speed);

  • 타입 가드
    • instanceof
      - 상속관계를 확인하는 명령어
      - 객체가 특정 클래스에 속하는지 아닌지를 확인할 수 있음

      class IDetail {
          constructor(public name: string, public age: number, public city: string) {}
      }
      
      type typeSNS = "KAKAO" | "NAVER";
      interface IUser {
          detail: IDetail;
          marketing: boolean;
          sns: typeSNS;
      }
      
      function setUser(
      		target: IUser,
      		param: keyof IUser,
      		newValue: typeof target[typeof param]
      ) {
          if (param === "marketing" && typeof newValue === "boolean") {
              target[param] = newValue;
      		// IDetail이 인터페이스일 경우 object로만 체크가 가능해서 클래스로 변경
      		// else if (param === "detail" && typeof newValue === "object") {
          } else if (param === "detail" && newValue instanceof IDetail) {
          } else if (param === "sns" && typeof newValue === "string") {
              const v: typeSNS = newValue;
              target[param] = v;
          }
      }
  • 타입 단언과 선언
    • 단언: as Type
    • 선언: : Type
profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글