Skip to content
Closed
Changes from 1 commit
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
Prev Previous commit
Next Next commit
move options expanding to internal type
  • Loading branch information
benzaria committed Oct 11, 2025
commit 8552e484f09289f768d83fb3dadd820e05132309
17 changes: 8 additions & 9 deletions source/reverse.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,18 @@ Reverse array/tuple elements.
*/
type _Reverse<
Array_ extends UnknownArray,
KeepOptional extends boolean,
Options extends Required<ReverseOptions>,
Head extends UnknownArray = [],
Tail extends UnknownArray = [],
> =
keyof Array_ & `${number}` extends never // Is `Array_` leading a rest element or empty
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be useful with a short code comment that describes the algorithm.

? Array_ extends readonly [...infer Rest, infer Last]
? _Reverse<Rest, KeepOptional, [...Head, Last], Tail>
? _Reverse<Rest, Options, [...Head, Last], Tail>
: [...Head, ...Array_, ...Tail]
: Array_ extends readonly [(infer First)?, ...infer Rest]
? _Reverse<Rest, KeepOptional, Head, [
? _Reverse<Rest, Options, Head, [
...IsOptionalKeyOf<Array_, '0'> extends true
? KeepOptional extends false
? Options['preserveOptionalModifier'] extends false
? [If<IsExactOptionalPropertyTypesEnabled, First, First | undefined>] // Add `| undefined` for optional elements, if `exactOptionalPropertyTypes` is disabled.
: [First?]
: [First],
Expand Down Expand Up @@ -99,16 +99,15 @@ reverse(['a', 'b', 'c', 'd']);
@category Array
*/
export type Reverse<Array_ extends UnknownArray, Options extends ReverseOptions = {}> =
IsAny<Array_> extends false // Prevent the return of `Readonly<[] | [unknown] | unknown[] | [...unknown[], unknown]>`
? Array_ extends UnknownArray // For distributing `Array_`
IsAny<Array_> extends true ? Array_ // Prevent the return of `Readonly<[] | [unknown] | unknown[] | [...unknown[], unknown]>`
: Array_ extends UnknownArray // For distributing `Array_`
? _Reverse<Array_, ApplyDefaultOptions<
ReverseOptions,
DefaultReverseOptions,
Options
>['preserveOptionalModifier']> extends infer Result
>> extends infer Result
? If<IsArrayReadonly<Array_>, Readonly<Result>, Result>
: never
: never
: Array_;
: never;

export {};