mirror of
https://github.com/sindresorhus/type-fest.git
synced 2026-01-25 14:57:30 +00:00
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import type {RequireExactlyOne} from './require-exactly-one.d.ts';
|
|
import type {IfNotAnyOrNever, RequireNone} from './internal/index.d.ts';
|
|
import type {If} from './if.d.ts';
|
|
import type {IsAny} from './is-any.d.ts';
|
|
import type {IsNever} from './is-never.d.ts';
|
|
|
|
/**
|
|
Create a type that requires exactly one of the given keys and disallows more, or none of the given keys. The remaining keys are kept as is.
|
|
|
|
@example
|
|
```
|
|
import type {RequireOneOrNone} from 'type-fest';
|
|
|
|
type Responder = RequireOneOrNone<{
|
|
text: () => string;
|
|
json: () => string;
|
|
secure: boolean;
|
|
}, 'text' | 'json'>;
|
|
|
|
const responder1: Responder = {
|
|
secure: true
|
|
};
|
|
|
|
const responder2: Responder = {
|
|
text: () => '{"message": "hi"}',
|
|
secure: true
|
|
};
|
|
|
|
const responder3: Responder = {
|
|
json: () => '{"message": "ok"}',
|
|
secure: true
|
|
};
|
|
```
|
|
|
|
@category Object
|
|
*/
|
|
export type RequireOneOrNone<ObjectType, KeysType extends keyof ObjectType = keyof ObjectType> =
|
|
IfNotAnyOrNever<ObjectType,
|
|
If<IsNever<KeysType>,
|
|
ObjectType,
|
|
_RequireOneOrNone<ObjectType, If<IsAny<KeysType>, keyof ObjectType, KeysType>>
|
|
>>;
|
|
|
|
type _RequireOneOrNone<ObjectType, KeysType extends keyof ObjectType> = (
|
|
| RequireExactlyOne<ObjectType, KeysType>
|
|
| RequireNone<KeysType>
|
|
) & Omit<ObjectType, KeysType>; // Ignore unspecified keys.
|
|
|
|
export {};
|