🤦🏻‍♀️
TL;DR

UPPER_SNAKE_CASE 상수만 정의하면 자동으로 camelCase 타입까지 만들 수 있어요.

type Separator = ' ' | '-' | '_';

type CamelCase<T extends string> = T extends `${infer Char1}${Separator}${infer Char2}${infer Char3}`
  ? `${Lowercase<Char1>}${Uppercase<Char2>}${CamelCase<Char3>}`
  : Lowercase<T>;

Bad

const DOCUMENT_TYPE = {
  MAIL_ORDER_BUSINESS_REPORT: '통신판매업 신고 서류',
  CERTIFICATE_OF_BUSINESS_REGISTRATION: '사업자 등록증',
  CORP_SEAL_CERTIFICATE: '법인 인감 증명서',
  COPY_OF_BANKBOOK: '통장 사본',
};

interface Params {
  document: {
    mailOrderBusinessReport?: File;
    certificateOfBusinessRegistration?: File;
    corpSealCertificate?: File;
    copyOfBankbook?: File;
  };
}

Good

const DOCUMENT_TYPE = {
  MAIL_ORDER_BUSINESS_REPORT: '통신판매업 신고 서류',
  CERTIFICATE_OF_BUSINESS_REGISTRATION: '사업자 등록증',
  CORP_SEAL_CERTIFICATE: '법인 인감 증명서',
  COPY_OF_BANKBOOK: '통장 사본',
};

type DocumentType = 'MAIL_ORDER_BUSINESS_REPORT' | 'CERTIFICATE_OF_BUSINESS_REGISTRATION' | 'CORP_SEAL_CERTIFICATE' | 'COPY_OF_BANKBOOK';

interface Params {
  document: {
    [K in CamelCase<DocumentType>]?: File;
  };
}

Best 👍

const DOCUMENT_TYPE = Object.freeze({
  MAIL_ORDER_BUSINESS_REPORT: '통신판매업 신고 서류',
  CERTIFICATE_OF_BUSINESS_REGISTRATION: '사업자 등록증',
  CORP_SEAL_CERTIFICATE: '법인 인감 증명서',
  COPY_OF_BANKBOOK: '통장 사본',
});

type DocumentType = keyof typeof DOCUMENT_TYPE;

interface Params {
  document: {
    [K in CamelCase<DocumentType>]?: File;
  };
}
이전 글
#kubernetes
Apache Kafka
다음 글
#typescript
두 배열의 모든 조합으로 구성된 배열 만들기
어라운드어스

Coding everything around us

이 블로그는 Gatsby로 만들었습니다.

백은주 Sara
Frontend Developer @wadiz