본문 바로가기
IT/typescript

[typescript] AtLeastOneRequired

by 내일은교양왕 2024. 12. 16.

AtLeastOneRequired 타입은 특정 객체에서 적어도 하나의 속성이 필수로 존재하도록 강제하는 타입입니다. 이를 구현하려면 TypeScript의 유틸리티 타입과 조건부 타입을 조합하여 각 속성마다 최소 한 개가 필수인 상태를 표현해야 합니다.

 

AtLeastOneRequired 타입 구현

type AtLeastOneRequired<T> = {
  [K in keyof T]-?: Required<Pick<T, K>> & Partial<Omit<T, K>>;
}[keyof T];

 

동작 원리

  1. Mapped Type:
    • K in keyof T를 통해 각 속성 K를 반복합니다.
    • 이때, Pick<T, K>를 사용하여 속성 K만 포함된 객체를 만듭니다.
    • Required<Pick<T, K>>는 해당 속성을 필수로 지정합니다.
  2. Partial Omit:
    • Omit<T, K>를 사용하여 나머지 속성들을 제외합니다.
    • Partial<Omit<T, K>>로 나머지 속성을 옵셔널로 만듭니다.
  3. Union:
    • 위에서 생성된 모든 경우의 객체들을 합칩니다. (&를 사용해 병합 후, [keyof T]로 유니언 타입 생성)

결과적으로, T의 모든 속성에 대해 하나의 필수 속성과 나머지 옵션 속성을 가진 타입의 유니언을 생성합니다.

 

사용 예제

type Test = {
  a?: string;
  b?: number;
  c?: boolean;
};

type AtLeastOne = AtLeastOneRequired<Test>;

 

위 코드에서 AtLeastOne 타입은 다음과 같이 동작합니다:

  • 적어도 a, b, 또는 c 중 하나는 필수로 존재해야 합니다.
  • 가능성 있는 타입:
  • { a: string; b?: number; c?: boolean } { a?: string; b: number; c?: boolean } { a?: string; b?: number; c: boolean }

 

TypeScript에서 활용하기

function useAtLeastOneRequired(input: AtLeastOneRequired<Test>) {
  console.log(input);
}

// 올바른 사용 예:
useAtLeastOneRequired({ a: "hello" });
useAtLeastOneRequired({ b: 42 });
useAtLeastOneRequired({ c: true, b: 5 });

// 오류 발생 (아무 속성도 없는 경우):
useAtLeastOneRequired({});

 

AtLeastOneRequired 타입은 API에서 일부 필드만 필수적으로 요구되는 경우 또는 객체의 최소 조건을 검증할 때 유용합니다.

'IT > typescript' 카테고리의 다른 글

[typescript] WeakRef  (0) 2024.12.28
[typescript] -? 의미  (0) 2024.12.05
[typescript] fattenObject 함수 type 만들기  (0) 2024.08.21
[typescript] infer  (0) 2024.08.14
[typescript] 함수타입(Function Type) 인자형  (0) 2024.08.14