0

How I can reverse this array of "readonly" function tuples? I borrowed Reverse from this library here typescript- tuple.

Playground

namespace Utils {
    export type IsFinite<Tuple extends any[], Finite, Infinite> = {
        empty: Finite
        nonEmpty: ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Rest) => any)
        ? IsFinite<Rest, Finite, Infinite>
        : never
        infinite: Infinite
    }[
        Tuple extends [] ? 'empty' :
        Tuple extends (infer Element)[] ?
        Element[] extends Tuple ?
        'infinite'
        : 'nonEmpty'
        : never
    ]

    export type Prepend<Tuple extends any[], Addend> =
        ((_: Addend, ..._1: Tuple) => any) extends ((..._: infer Result) => any) ? Result : never


    export type Reverse<Tuple extends any[], Prefix extends any[] = []> = {
        empty: Prefix,
        nonEmpty: ((..._: Tuple) => any) extends ((_: infer First, ..._1: infer Next) => any)
        ? Reverse<Next, Prepend<Prefix, First>>
        : never
        infinite: {
            ERROR: 'Cannot reverse an infinite tuple'
            CODENAME: 'InfiniteTuple'
        }
    }[
        Tuple extends [any, ...any[]]
        ? IsFinite<Tuple, 'nonEmpty', 'infinite'>
        : 'empty'
    ]
}

export type ReadFuncs = readonly ((x: any) => any)[]
export type Reverse<Tuple extends any[]> = Utils.Reverse<Tuple>

const example = [() => 'meow'] as const

type v = Reverse<typeof example>

Playground with Readonly

ThomasReggi
  • 55,053
  • 85
  • 237
  • 424

0 Answers0