Son CV dans un terminal web en Javascript!
https://terminal-cv.gregandev.fr
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.
44 lines
1.2 KiB
44 lines
1.2 KiB
2 years ago
|
/**
|
||
|
Extract the keys from a type where the value type of the key extends the given `Condition`.
|
||
|
|
||
|
Internally this is used for the `ConditionalPick` and `ConditionalExcept` types.
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
import {ConditionalKeys} from 'type-fest';
|
||
|
|
||
|
interface Example {
|
||
|
a: string;
|
||
|
b: string | number;
|
||
|
c?: string;
|
||
|
d: {};
|
||
|
}
|
||
|
|
||
|
type StringKeysOnly = ConditionalKeys<Example, string>;
|
||
|
//=> 'a'
|
||
|
```
|
||
|
|
||
|
To support partial types, make sure your `Condition` is a union of undefined (for example, `string | undefined`) as demonstrated below.
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
type StringKeysAndUndefined = ConditionalKeys<Example, string | undefined>;
|
||
|
//=> 'a' | 'c'
|
||
|
```
|
||
|
*/
|
||
|
export type ConditionalKeys<Base, Condition> = NonNullable<
|
||
|
// Wrap in `NonNullable` to strip away the `undefined` type from the produced union.
|
||
|
{
|
||
|
// Map through all the keys of the given base type.
|
||
|
[Key in keyof Base]:
|
||
|
// Pick only keys with types extending the given `Condition` type.
|
||
|
Base[Key] extends Condition
|
||
|
// Retain this key since the condition passes.
|
||
|
? Key
|
||
|
// Discard this key since the condition fails.
|
||
|
: never;
|
||
|
|
||
|
// Convert the produced object into a union type of the keys which passed the conditional test.
|
||
|
}[keyof Base]
|
||
|
>;
|