Open
Description
Edit: Remove indexing part
Edit 2: Replace tuple mapping syntax with normal mapped types
Search Terms
Concatentate and merge tuples' entries.
Suggestion
- I would like to be able to extract and spread in positions other than the last part of a tuple.
- I would like to merge a tuple into an intersection or concatenation of its members.
Use Cases
- Converting a tuple to its intersection, such as with
Object.assign
's assignee. - Typing
Array.prototype.concat
correctly for tuples.
Syntax
The syntax comes in a few new forms:
[...A, B]
appendsB
to the tupleA
. Similarly,[...infer A, any] extends B ? A : []
drops the last item of the tuple and[...any[], infer A] extends B ? A : never
extracts the first.{... ...T}
for an n-ary merge and[... ...T]
an n-ary concatenation.
Examples
Here's the types for each method I mentioned above.
interface Array<T> {
concat<U extends any[]>(...others: U): [...this, ... ...{[I in keyof U]: (
U[I] extends any[] ? N : U[I] extends ArrayLike<infer R> ? R[] : [U[I]]
)}];
}
interface ObjectConstructor {
assign(target: {... ...typeof sources}, ...sources: object[]): typeof target;
}
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript / JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. new expression-level syntax)