You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
827 B
32 lines
827 B
import {Except} from './except'; |
|
|
|
/** |
|
Create a type that requires at least one of the given properties. The remaining properties 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 properties to each mapped type. |
|
& Except<ObjectType, KeysType>;
|
|
|