diff --git a/src/namePathType.ts b/src/namePathType.ts index 8e54c6f1..38235915 100644 --- a/src/namePathType.ts +++ b/src/namePathType.ts @@ -6,27 +6,27 @@ type BaseNamePath = string | number | boolean | (string | number | boolean)[]; export type DeepNamePath< Store = any, ParentNamePath extends any[] = [], -> = ParentNamePath['length'] extends 10 +> = ParentNamePath['length'] extends 5 ? never : // Follow code is batch check if `Store` is base type - true extends (Store extends BaseNamePath ? true : false) - ? ParentNamePath['length'] extends 0 - ? Store | BaseNamePath // Return `BaseNamePath` instead of array if `ParentNamePath` is empty - : Store extends any[] - ? [...ParentNamePath, number] // Connect path - : never - : Store extends any[] // Check if `Store` is `any[]` - ? // Connect path. e.g. { a: { b: string }[] } - // Get: [a] | [ a,number] | [ a ,number , b] - [...ParentNamePath, number] | DeepNamePath - : keyof Store extends never // unknown - ? Store - : { - // Convert `Store` to . We mark key a `FieldKey` - [FieldKey in keyof Store]: Store[FieldKey] extends Function - ? never - : - | (ParentNamePath['length'] extends 0 ? FieldKey : never) // If `ParentNamePath` is empty, it can use `FieldKey` without array path - | [...ParentNamePath, FieldKey] // Exist `ParentNamePath`, connect it - | DeepNamePath[FieldKey], [...ParentNamePath, FieldKey]>; // If `Store[FieldKey]` is object - }[keyof Store]; + true extends (Store extends BaseNamePath ? true : false) + ? ParentNamePath['length'] extends 0 + ? Store | BaseNamePath // Return `BaseNamePath` instead of array if `ParentNamePath` is empty + : Store extends any[] + ? [...ParentNamePath, number] // Connect path + : never + : Store extends any[] // Check if `Store` is `any[]` + ? // Connect path. e.g. { a: { b: string }[] } + // Get: [a] | [ a,number] | [ a ,number , b] + [...ParentNamePath, number] | DeepNamePath + : keyof Store extends never // unknown + ? Store + : { + // Convert `Store` to . We mark key a `FieldKey` + [FieldKey in keyof Store]: Store[FieldKey] extends Function + ? never + : + | (ParentNamePath['length'] extends 0 ? FieldKey : never) // If `ParentNamePath` is empty, it can use `FieldKey` without array path + | [...ParentNamePath, FieldKey] // Exist `ParentNamePath`, connect it + | DeepNamePath[FieldKey], [...ParentNamePath, FieldKey]>; // If `Store[FieldKey]` is object + }[keyof Store];