Version: 0.1.00.2.00.3.00.3.10.4.00.4.10.5.00.5.10.5.20.6.00.7.00.7.10.8.00.8.10.9.00.10.00.11.00.12.00.13.00.13.10.14.00.15.00.15.10.16.00.17.00.18.00.18.10.19.00.20.00.20.10.20.20.21.00.21.10.21.20.21.31.0.01.0.11.0.21.1.01.1.11.1.21.1.31.2.01.2.11.2.21.2.31.3.01.4.02.0.02.1.02.2.02.3.02.3.12.3.22.3.32.3.42.4.02.5.02.5.12.5.22.5.32.5.42.6.02.7.02.8.02.9.02.10.02.11.02.11.12.11.22.12.02.12.12.12.22.13.02.13.12.14.02.15.02.15.12.16.02.17.02.18.02.18.12.19.03.0.03.1.03.2.03.3.03.4.03.5.03.5.13.5.23.5.33.5.43.5.53.5.63.5.73.6.03.6.13.7.03.7.13.7.23.8.03.9.03.10.03.11.03.11.13.12.03.13.03.13.14.0.04.1.04.2.04.3.04.3.14.3.24.3.34.4.04.5.04.6.04.7.04.7.14.8.04.8.14.8.24.8.34.9.04.10.04.10.14.10.24.10.34.11.04.11.14.12.04.13.04.13.14.14.04.15.04.16.04.17.04.18.04.18.14.18.24.18.34.19.04.20.04.20.14.21.04.22.04.22.14.23.04.24.04.25.04.26.04.26.14.27.04.27.14.28.04.28.14.29.04.29.14.30.0
import type {IfNever} from './if-never';
/**
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 type {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.
type StringKeysAndUndefined = ConditionalKeys<Example, string | undefined>;
//=> 'a' | 'c'
@category Object
*/
export type ConditionalKeys<Base, Condition> =
{
// 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
// If the value for the key extends never, only include it if `Condition` also extends never
? IfNever<Base[Key], IfNever<Condition, Key, never>, 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];