Skip to content

Allow use of spread operator in tuple types#24902

@aneilbaboo

Description

@aneilbaboo

Search Terms

tuple type rest spread typescript

Suggestion

I'd like to be able to write tuple types using the spread operator. For example:

typeFoo=[string, ...number[]];// first elt must be string, rest must be numbers

Currently, this produces an error at the ellipsis: "Type expected".

Here is a question asking much the same thing on Stack Overflow: https://stackoverflow.com/questions/44934541/how-to-use-the-spread-operator-in-a-typescript-tuple

It seems related to #10727, but that issue focuses on Object rest/spread, whereas this is specifically about tuples.

Use Cases

Typed tuples are part of the existing language. So it seems natural that one should be able to type rest arguments .

For example, if you want to represent a syntax tree, you might want to write:

typeFunCall=['FUNCALL',Symbol, ...Expression[]];// error in 2.9.1 :(typeSymbol=string;typeExpression=FunCall|Scalar;typeScalar=number|string|null;

But this isn't allowed in Typescript 2.9.1.

Examples

typeFoo=[string, ...number[]];constf1: Foo=["str",2,3,4];// should passconstf2: Foo=["str","2",3,4];// should fail: // "Type '(string | number)[]' is not assignable to type 'number[]'.constf2: Foo=["str",2,"3",4];// should fail:// "Type '(number | string)[]' is not assignable to type 'number[]'.constf1: Foo=[1,2,3,4];// should fail:// "Type 'number' is not assignable to type 'string'.

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)

Metadata

Metadata

Assignees

Labels

FixedA PR has been merged for this issueSuggestionAn idea for TypeScript

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions