luau/rfcs/syntax-typed-variadics.md

44 lines
1.7 KiB
Markdown
Raw Normal View History

# Typed variadics
> Note: this RFC was adapted from an internal proposal that predates RFC process
## Summary
Add syntax for ascribing a type to variadic pack (`...`).
## Motivation
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.
## Design
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.
## Drawbacks
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.
## Alternatives
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