mirror of
https://github.com/Sevichecc/Urara-Blog.git
synced 2025-05-02 19:59:31 +08:00
32 lines
809 B
Text
32 lines
809 B
Text
import {Except} from './except';
|
|
|
|
/**
|
|
Create a type that requires at least one of the given keys. The remaining keys are kept as is.
|
|
|
|
@example
|
|
```
|
|
import {RequireAtLeastOne} from 'type-fest';
|
|
|
|
type Responder = {
|
|
text?: () => string;
|
|
json?: () => string;
|
|
|
|
secure?: boolean;
|
|
};
|
|
|
|
const responder: RequireAtLeastOne<Responder, 'text' | 'json'> = {
|
|
json: () => '{"message": "ok"}',
|
|
secure: true
|
|
};
|
|
```
|
|
*/
|
|
export type RequireAtLeastOne<ObjectType, KeysType extends keyof ObjectType = keyof ObjectType> =
|
|
{
|
|
// For each Key in KeysType make a mapped type
|
|
[Key in KeysType]: (
|
|
// …by picking that Key's type and making it required
|
|
Required<Pick<ObjectType, Key>>
|
|
)
|
|
}[KeysType]
|
|
// …then, make intersection types by adding the remaining keys to each mapped type.
|
|
& Except<ObjectType, KeysType>;
|