Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions source/paths.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -213,13 +213,15 @@ type InternalPaths<T, Options extends Required<PathsOptions>, CurrentDepth exten
? ((Options['leavesOnly'] extends true
? Options['maxRecursionDepth'] extends CurrentDepth
? TransformedKey
: T[Key] extends infer Value // For distributing `T[Key]`
? (Value extends readonly [] | NonRecursiveType | Exclude<MapsSetsOrArrays, UnknownArray>
? TransformedKey
: IsNever<keyof Value> extends true // Check for empty object & `unknown`, because `keyof unknown` is `never`.
: IsNever<T[Key]> extends true
? TransformedKey
: T[Key] extends infer Value // For distributing `T[Key]`
? (Value extends readonly [] | NonRecursiveType | Exclude<MapsSetsOrArrays, UnknownArray>
? TransformedKey
: never)
: never // Should never happen
: IsNever<keyof Value> extends true // Check for empty object & `unknown`, because `keyof unknown` is `never`.
? TransformedKey
: never)
: never // Should never happen
: TransformedKey
) extends infer _TransformedKey
// If `depth` is provided, the condition becomes truthy only when it matches `CurrentDepth`.
Expand Down
3 changes: 3 additions & 0 deletions test-d/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,9 @@ expectType<'a.b'>(unknownLeaves);
declare const anyLeaves: Paths<{a: {b: any}}, {leavesOnly: true}>;
expectType<'a.b'>(anyLeaves);

declare const neverLeaves: Paths<{a: {b: never}}, {leavesOnly: true}>;
expectType<'a.b'>(neverLeaves);

// -- depth option --
declare const zeroDepth: Paths<DeepObject, {depth: 0}>;
expectType<'a'>(zeroDepth);
Expand Down