AtLeastOneRequired 타입은 특정 객체에서 적어도 하나의 속성이 필수로 존재하도록 강제하는 타입입니다. 이를 구현하려면 TypeScript의 유틸리티 타입과 조건부 타입을 조합하여 각 속성마다 최소 한 개가 필수인 상태를 표현해야 합니다.
AtLeastOneRequired 타입 구현
type AtLeastOneRequired<T> = {
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Omit<T, K>>;
}[keyof T];
동작 원리
- Mapped Type:
- K in keyof T를 통해 각 속성 K를 반복합니다.
- 이때, Pick<T, K>를 사용하여 속성 K만 포함된 객체를 만듭니다.
- Required<Pick<T, K>>는 해당 속성을 필수로 지정합니다.
- Partial Omit:
- Omit<T, K>를 사용하여 나머지 속성들을 제외합니다.
- Partial<Omit<T, K>>로 나머지 속성을 옵셔널로 만듭니다.
- 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 |