UNPKG

9.28 kBTypeScriptView Raw
1import type { Head, Tail } from "./tuple.js";
2/**
3 * Extracts from A all keys which have values assignable to type B.
4 */
5export declare type TypedKeys<A, B> = {
6 [P in Keys<A>]: B extends A[P] ? P : never;
7}[keyof A];
8export declare type NumericKeys<T> = TypedKeys<T, number>;
9export declare type StringKeys<T> = TypedKeys<T, string>;
10export declare type DeepPartial<T> = Partial<{
11 [k in keyof T]: DeepPartial<T[k]>;
12}>;
13export declare type Keys<T> = keyof Required<T>;
14export declare type Keys1<T, A extends Keys<T>> = Keys<Required<T>[A]>;
15export declare type Keys2<T, A extends Keys<T>, B extends Keys1<T, A>> = Keys1<Required<T>[A], B>;
16export declare type Keys3<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>> = Keys2<Required<T>[A], B, C>;
17export declare type Keys4<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>> = Keys3<Required<T>[A], B, C, D>;
18export declare type Keys5<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>> = Keys4<Required<T>[A], B, C, D, E>;
19export declare type Keys6<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>> = Keys5<Required<T>[A], B, C, D, E, F>;
20export declare type Keys7<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>> = Keys6<Required<T>[A], B, C, D, E, F, G>;
21export declare type Keys8<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>, H extends Keys7<T, A, B, C, D, E, F, G>> = Keys7<Required<T>[A], B, C, D, E, F, G, H>;
22/**
23 * Internal type used as a reducer for the KeyN type.
24 *
25 * @internal
26 *
27 * @param T - structure to validate the key against.
28 * @param L - Current value.
29 * @param R - Remaining values.
30 */
31declare type KeysNReducer<T, L, R extends unknown[]> = L extends keyof T ? {
32 0: keyof Required<T>[L];
33 1: KeysNReducer<Required<T>[L], Head<R>, Tail<R>>;
34}[R extends [] ? 0 : 1] : never;
35/**
36 * Generalised version of Keys0 - Keys7.
37 */
38export declare type KeysN<T, L extends unknown[]> = L extends [] ? Keys<T> : KeysNReducer<T, Head<L>, Tail<L>>;
39export declare type Val1<T, A extends Keys<T>> = T[A];
40export declare type Val2<T, A extends Keys<T>, B extends Keys1<T, A>> = ValN<T, [A, B]>;
41export declare type Val3<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>> = ValN<T, [A, B, C]>;
42export declare type Val4<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>> = ValN<T, [A, B, C, D]>;
43export declare type Val5<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>> = ValN<T, [A, B, C, D, E]>;
44export declare type Val6<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>> = ValN<T, [A, B, C, D, E, F]>;
45export declare type Val7<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>> = ValN<T, [A, B, C, D, E, F, G]>;
46export declare type Val8<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>, H extends Keys7<T, A, B, C, D, E, F, G>> = ValN<T, [A, B, C, D, E, F, G, H]>;
47/**
48 * Internal reducer for ValN.
49 *
50 * @internal
51 *
52 * @param T - he structure to get the values from.
53 * @param C - he current key.
54 * @param R - he remaining keys
55 */
56declare type ValNReducer<T, C, R extends unknown[]> = C extends keyof T ? {
57 0: T[C];
58 1: ValNReducer<Required<T>[C], Head<R>, Tail<R>>;
59}[R extends [] ? 0 : 1] : never;
60/**
61 * Generalised version of Val1-Val7
62 */
63export declare type ValN<T, L extends unknown[]> = L extends [] ? T : ValNReducer<T, Head<L>, Tail<L>>;
64/**
65 * Utilities for constructing types with nested keys removed.
66 */
67export declare type Without<T, A extends Keys<T>> = Omit<T, A>;
68export declare type Without2<T, A extends Keys<T>, B extends Keys1<T, A>> = Without<T, A> & {
69 [id in A]: Without<Val1<T, A>, B>;
70};
71export declare type Without3<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>> = Without<T, A> & {
72 [id in A]: Without2<Val1<T, A>, B, C>;
73};
74export declare type Without4<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>> = Without<T, A> & {
75 [id in A]: Without3<Val1<T, A>, B, C, D>;
76};
77export declare type Without5<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>> = Without<T, A> & {
78 [id in A]: Without4<Val1<T, A>, B, C, D, E>;
79};
80export declare type Without6<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>> = Without<T, A> & {
81 [id in A]: Without5<Val1<T, A>, B, C, D, E, F>;
82};
83export declare type Without7<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>> = Without<T, A> & {
84 [id in A]: Without6<Val1<T, A>, B, C, D, E, F, G>;
85};
86export declare type Without8<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>, H extends Keys7<T, A, B, C, D, E, F, G>> = Without<T, A> & {
87 [id in A]: Without7<Val1<T, A>, B, C, D, E, F, G, H>;
88};
89/**
90 * Internal reducer used as a building block for WithoutN.
91 *
92 * @internal
93 *
94 * @param T - he structure to remove keys from.
95 * @param C - he current key.
96 * @param R - he remaining keys.
97 */
98declare type WithoutNReducer<T, C, R extends unknown[]> = C extends keyof T ? {
99 0: Without<T, C>;
100 1: Without<T, C> & Record<C, WithoutNReducer<T[C], Head<R>, Tail<R>>>;
101}[R extends [] ? 0 : 1] : never;
102/**
103 * Generalised version of Without0-Without8.
104 */
105export declare type WithoutN<T, P extends unknown[]> = WithoutNReducer<T, Head<P>, Tail<P>>;
106/**
107 * Utilities for replacing types of nested keys.
108 */
109export declare type Replace<T, A extends Keys<T>, V> = Without<T, A> & {
110 [id in A]: V;
111};
112export declare type Replace2<T, A extends Keys<T>, B extends Keys1<T, A>, V> = Without<T, A> & {
113 [id in A]: Replace<Val1<T, A>, B, V>;
114};
115export declare type Replace3<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, V> = Without<T, A> & {
116 [id in A]: Replace2<Val1<T, A>, B, C, V>;
117};
118export declare type Replace4<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, V> = Without<T, A> & {
119 [id in A]: Replace3<Val1<T, A>, B, C, D, V>;
120};
121export declare type Replace5<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, V> = Without<T, A> & {
122 [id in A]: Replace4<Val1<T, A>, B, C, D, E, V>;
123};
124export declare type Replace6<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, V> = Without<T, A> & {
125 [id in A]: Replace5<Val1<T, A>, B, C, D, E, F, V>;
126};
127export declare type Replace7<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>, V> = Without<T, A> & {
128 [id in A]: Replace6<Val1<T, A>, B, C, D, E, F, G, V>;
129};
130export declare type Replace8<T, A extends Keys<T>, B extends Keys1<T, A>, C extends Keys2<T, A, B>, D extends Keys3<T, A, B, C>, E extends Keys4<T, A, B, C, D>, F extends Keys5<T, A, B, C, D, E>, G extends Keys6<T, A, B, C, D, E, F>, H extends Keys7<T, A, B, C, D, E, F, G>, V> = Without<T, A> & {
131 [id in A]: Replace7<Val1<T, A>, B, C, D, E, F, G, H, V>;
132};
133/**
134 * Internal reducer used as a building block for ReduceN.
135 *
136 * @internal
137 *
138 * @param T - he structure to remove keys from.
139 * @param C - he current key.
140 * @param R - he remaining keys.
141 * @param V - he type to use for the replacement.
142 */
143declare type ReplaceNReducer<T, C, R extends unknown[], V> = C extends keyof T ? {
144 0: Replace<T, C, V>;
145 1: Without<T, C> & Record<C, ReplaceNReducer<T[C], Head<R>, Tail<R>, V>>;
146}[R extends [] ? 0 : 1] : never;
147/**
148 * Generalised version of Replace0-Replace8.
149 */
150export declare type ReplaceN<T, P extends unknown[], V> = ReplaceNReducer<T, Head<P>, Tail<P>, V>;
151export {};
152//# sourceMappingURL=keyval.d.ts.map
\No newline at end of file