Note: this RFC was adapted from an internal proposal that predates RFC process
Status: Implemented
Add syntax for ascribing a type to variadic pack (...
).
Luau’s type checker internally can represent a typed variadic: any number of values of the same type. Developers should be able to describe this construct in their own code, for cases where they have a function that accepts an arbitrary number of string
s, for example.
We think that the postfix ...: T
syntax is the best balance of readability and simplicity. In function type annotations, we will use ...T
:
function math.max(...: number): number
end
type fn = (...string) -> string
type fn2 = () -> ...string
This doesn’t introduce syntactical ambiguity and should cover all cases where we need to represent this construct. Like ...
itself, this syntax is only legal as the last parameter to a function.
Like all type annotations, the ...: T
syntax has no effect on runtime behavior versus an unannotated ...
.
There are currently no plans to introduce named variadics, but this proposal leaves room to adopt them with the form ...name: Type
in function declarations in the future.
The mismatch between the type of ...
in function declaration (number
) and type declaration (...number
) is a bit awkward. This also gets more complicated when we introduce generic variadic packs.
We considered several other syntaxes for this construct:
...T
: leaves no room to introduce named variadics...: T...
: redundant ...
... : ...T
: feels redundant, same as above...: T*
: potentially confusing for users with C knowledge, where T*
is a pointer type