UNPKG

2.23 kBTypeScriptView Raw
1import type {CamelCase, CamelCaseOptions} from './camel-case';
2import type {UnknownArray} from './unknown-array';
3
4/**
5Convert object properties to camel case recursively.
6
7This can be useful when, for example, converting some API types from a different style.
8
9@see CamelCasedProperties
10@see CamelCase
11
12@example
13```
14import type {CamelCasedPropertiesDeep} from 'type-fest';
15
16interface User {
17 UserId: number;
18 UserName: string;
19}
20
21interface UserWithFriends {
22 UserInfo: User;
23 UserFriends: User[];
24}
25
26const result: CamelCasedPropertiesDeep<UserWithFriends> = {
27 userInfo: {
28 userId: 1,
29 userName: 'Tom',
30 },
31 userFriends: [
32 {
33 userId: 2,
34 userName: 'Jerry',
35 },
36 {
37 userId: 3,
38 userName: 'Spike',
39 },
40 ],
41};
42```
43
44@category Change case
45@category Template literal
46@category Object
47*/
48export type CamelCasedPropertiesDeep<
49 Value,
50 Options extends CamelCaseOptions = {preserveConsecutiveUppercase: true},
51> = Value extends Function
52 ? Value
53 : Value extends UnknownArray
54 ? CamelCasedPropertiesArrayDeep<Value>
55 : Value extends Set<infer U>
56 ? Set<CamelCasedPropertiesDeep<U, Options>>
57 : {
58 [K in keyof Value as CamelCase<K, Options>]: CamelCasedPropertiesDeep<
59 Value[K],
60 Options
61 >;
62 };
63
64// This is a copy of DelimiterCasedPropertiesArrayDeep (see: delimiter-cased-properties-deep.d.ts).
65// These types should be kept in sync.
66type CamelCasedPropertiesArrayDeep<Value extends UnknownArray> =
67 Value extends []
68 ? []
69 : // Tailing spread array
70 Value extends [infer U, ...infer V]
71 ? [CamelCasedPropertiesDeep<U>, ...CamelCasedPropertiesDeep<V>]
72 : Value extends readonly [infer U, ...infer V]
73 ? readonly [CamelCasedPropertiesDeep<U>, ...CamelCasedPropertiesDeep<V>]
74 : // Leading spread array
75 Value extends readonly [...infer U, infer V]
76 ? [...CamelCasedPropertiesDeep<U>, CamelCasedPropertiesDeep<V>]
77 : Value extends readonly [...infer U, infer V]
78 ? readonly [
79 ...CamelCasedPropertiesDeep<U>,
80 CamelCasedPropertiesDeep<V>,
81 ]
82 : // Array
83 Value extends Array<infer U>
84 ? Array<CamelCasedPropertiesDeep<U>>
85 : Value extends ReadonlyArray<infer U>
86 ? ReadonlyArray<CamelCasedPropertiesDeep<U>>
87 : never;