@dune2/tools 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dune2/tools",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "i18n"
@@ -29,14 +29,29 @@ export const fieldsMap: any =
29
29
  },
30
30
  );
31
31
 
32
- type DeepKeys<T> =
33
- T extends Record<string, any>
34
- ? { [K in keyof T]: K | DeepKeys<T[K]> }[keyof T]
35
- : never;
36
-
37
32
  /**
38
33
  * FieldsMap 会将对象的所有键(包括嵌套对象中的键)拍平为单层结构,
39
34
  * 并将每个键映射为自身的字符串字面量类型。
40
35
  */
41
- export type FieldsMap<T> =
42
- T extends Record<string, any> ? { [K in DeepKeys<T>]: K } : never;
36
+ export type FieldsMap<T> = {
37
+ [K in keyof UnionToIntersection<Pieces<T>>]-?: K;
38
+ };
39
+ // 联合 -> 交叉
40
+ type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (
41
+ x: infer I,
42
+ ) => void
43
+ ? I
44
+ : never;
45
+
46
+ // 递归收集各层属性(保留原属性引用),数组下钻元素,忽略 undefined/null,遇到循环则停止
47
+ type Pieces<T, Seen extends readonly unknown[] = []> = T extends Seen[number]
48
+ ? // 已经走过这一层,避免循环
49
+ {}
50
+ : T extends readonly (infer U)[]
51
+ ? Pieces<U, Seen>
52
+ : T extends object
53
+ ? {
54
+ // 保留原属性引用 + 下钻
55
+ [K in keyof T]-?: Pick<T, K> & Pieces<T[K], [...Seen, T]>;
56
+ }[keyof T]
57
+ : {};