main
Last change
on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago |
Initial commit
|
-
Property mode
set to
100644
|
File size:
1.2 KB
|
Line | |
---|
1 | // TODO: Remove this when we target TypeScript >=3.5.
|
---|
2 | type _Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
|
---|
3 |
|
---|
4 | /**
|
---|
5 | Create a type that requires exactly one of the given keys and disallows more. The remaining keys are kept as is.
|
---|
6 |
|
---|
7 | Use-cases:
|
---|
8 | - Creating interfaces for components that only need one of the keys to display properly.
|
---|
9 | - Declaring generic keys in a single place for a single use-case that gets narrowed down via `RequireExactlyOne`.
|
---|
10 |
|
---|
11 | The caveat with `RequireExactlyOne` is that TypeScript doesn't always know at compile time every key that will exist at runtime. Therefore `RequireExactlyOne` can't do anything to prevent extra keys it doesn't know about.
|
---|
12 |
|
---|
13 | @example
|
---|
14 | ```
|
---|
15 | import {RequireExactlyOne} from 'type-fest';
|
---|
16 |
|
---|
17 | type Responder = {
|
---|
18 | text: () => string;
|
---|
19 | json: () => string;
|
---|
20 | secure: boolean;
|
---|
21 | };
|
---|
22 |
|
---|
23 | const responder: RequireExactlyOne<Responder, 'text' | 'json'> = {
|
---|
24 | // Adding a `text` key here would cause a compile error.
|
---|
25 |
|
---|
26 | json: () => '{"message": "ok"}',
|
---|
27 | secure: true
|
---|
28 | };
|
---|
29 | ```
|
---|
30 | */
|
---|
31 | export type RequireExactlyOne<ObjectType, KeysType extends keyof ObjectType = keyof ObjectType> =
|
---|
32 | {[Key in KeysType]: (
|
---|
33 | Required<Pick<ObjectType, Key>> &
|
---|
34 | Partial<Record<Exclude<KeysType, Key>, never>>
|
---|
35 | )}[KeysType] & _Omit<ObjectType, KeysType>;
|
---|
Note:
See
TracBrowser
for help on using the repository browser.