[Typescript] 객체의 특정 속성 유형을 덮어쓰는 유형 함수 만들기

성과물


/**
 * 特定のプロパティを上書きする型関数
 * Overwrite<Type, OverwritingType>
 */
export type Overwrite<T, U extends { [Key in keyof T]?: unknown }> = Omit<
  T,
  keyof U
> & U;

너 뭐 하고 싶어?


type Person = {
  firstName: string;
  lastName: string;
  age: string;
};
예를 들어 상기 대상이 존재하면 age 유형 함수를 만들고 속성을 string에서 number로 쉽게 안전하게 바꿀 수 있는 유형 함수를 만들고 싶다.
※ 단, 속성의 덮어쓰기는 혼란을 초래할 수 있으므로 이번 예시에서 보듯이 다시 설계해야 합니다.
우리의 경우 ORM에서 Prism을 사용하여 Json 데이터를 얻었을 때any형으로 바뀌었다.그때 나는 단지 json 데이터를 우리가 만든 유형에 덮어쓰고 싶었다.

형식 함수를 사용하지 않는 덮어쓰기 방법


type Person = {
  firstName: string;
  lastName: string;
  age: string;
};

type NewPerson = Omit<Person, "age"> & { // ①
  age: string; // ②
};

문제점

  • 덮어쓰려는 속성이 증가할 때마다 ①, ②에 추가 기술
  • 필요
  • ②의 속성은 실질적으로 무엇이든 추가할 수 있기 때문에 안전성이 결여된 & 연결이 발생할 수 있다
  • 일반 이중화
  • 유형 함수를 사용하는 경우


    /**
     * 特定のプロパティを上書きする型関数
     */
    export type Overwrite<T, U extends { [Key in keyof T]?: unknown }> = Omit<
      T,
      keyof U
    > & U;
    
    type Person = {
      firstName: string;
      lastName: string;
      age: string;
    };
    
    type NewPerson = Overwrite<Person, {age: number;}>
    
    어때요? Overwrite를 사용하면 특정 속성만 안전하게 덮어쓸 수 있을 것 같아요.
    예를 들어 타자age에도 오류가 발생할 수 있다.
    간편한 Overwrite 설치
  • 일반 정의 수신 함수 사용
  • 첫 번째 파라미터는 대상
  • 두 번째 파라미터는 extends를 통해 대상의 특정한 속성만 지정하도록 제한한다
  • Omit으로 객체 속성 삭제
  • 첫 번째 파라미터와 두 번째 파라미터를 합쳐서 되돌아오기
  • 끝맺다


    살펴봤는데 이 간단한 형 함수가 어디에도 없어서 제작해서 공개했어요.
    장면을 활용하는 데는 한계가 있지만 도움이 된다면👋

    좋은 웹페이지 즐겨찾기