const ret1: readonly Ĭonsole.log(ret1) // Return arr.slice(start, end) as readonly any as TupleSlice Ĭonst tuple = as const To demonstrate that this more or less represents what array slice() does, let's write a function and test it: function slice( Now we can use TupleSplit to implement TakeFirst, returning just the first N elements of T, and SkipFirst, which skips the first N elements of T: type TakeFirst =Īnd finally TupleSlice produces the slice of tuple T from start position S to end position E (remember, slices are inclusive of the start index, and exclusive of the end index) by taking the first E elements of T and skipping the first S elements of the result: type TupleSlice = Let's verify that it works: type Test = TupleSplit If you try this on ill-behaved types like non-fixed-length tuples or unions of things, you might get weird results. If you try this on long tuples (lengths more than 25 or so) you can expect to see recursion errors. This works via recursive conditional types on variadic tuples and is therefore more computationally intensive than the relatively simple ParametersExceptFirst implementation above. (If N is more than the length of T then the first piece is all of T and the second piece is empty): type TupleSplit = First let's write TupleSplit which takes a tuple T and a numeric literal type N, and splits the tuple T at index N, returning two pieces: the first piece is the first N elements of T, and the second piece is everything after that. UPDATE: arbitrary slicing of tuples with numeric literals is possible, but not pretty and has caveats.
type FooParamsExceptFirst = ĭeclare function foo(x: string, y: number, z: boolean): Date Type FooParamsExceptFirst = ParametersExceptFirst
T extends (.args: infer P) => any ? P : never Īnd verify that it works: declare function foo(x: string, y: number, z: boolean): Date Yes, you can use conditional type inference on the function type, in a way very similar to how the Parameters utility type is implemented: type ParametersExceptFirst =į extends (arg0: any.