diff --git a/docs/_posts/2022-11-30-luau-recap-november-2022.md b/docs/_posts/2022-11-30-luau-recap-november-2022.md index 2a64ec5d..78ac90d0 100644 --- a/docs/_posts/2022-11-30-luau-recap-november-2022.md +++ b/docs/_posts/2022-11-30-luau-recap-november-2022.md @@ -7,7 +7,50 @@ While the team is busy to bring some bigger things in the future, we have made s [Cross-posted to the [Roblox Developer Forum](https://devforum.roblox.com/t/luau-recap-november-2022/).] -## Error messages +## Analysis improvements + +We have improved tagged union type refinements to only include unhandled type cases in the `else` branch of the `if` statement: + +```lua +type Ok = { tag: "ok", value: T } +type Err = { tag: "error", msg: string } +type Result = Ok | Err + +function unwrap(r: Result): T? + if r.tag == "ok" then + return r.value + else + -- Luau now understands that 'r' here can only be the 'Err' part + print(r.msg) + return nil + end +end +``` + +For better inference, we updated definition of `Enum.SomeType:GetEnumItems()` to return `{Enum.SomeType}` instead of common `{EnumItem}` and the return type of `next` function now includes the possibility of key being `nil`. + +Finally, if you use `and` operator on non-boolean values, `boolean` type will no longer be added by the type inference: + +```lua +local function f1(a: number?) + -- 'x' is still a 'number?' and doesn't become 'boolean | number' + local x = a and 5 +end +``` + +## Error message improvements + +We now give an error when built-in types are being redefined: + +```lua +type string = number -- Now an error: Redefinition of type 'string' +``` + +We also had a parse error missing in case you forgot your default type pack parameter value. We accepted the following code silently without raising an issue: + +```lua +type Foo = nil -- Now an error: Expected type, got '>' +``` Error about function argument count mismatch no longer points at the last argument, but instead at the function in question. So, instead of: @@ -26,16 +69,6 @@ myfunction(123) ~~~~~~~~~~ ``` -Parsing now recovers with a more precise error message if you forget a comma in table constructor spanning multiple lines: - -```lua -local t = { - a = 1 - b = 2 -- Expected ',' after table constructor element - c = 3 -- Expected ',' after table constructor element -} -``` - If you iterate over a table value that could also be `nil`, you get a better explanation in the error message: ```lua @@ -51,15 +84,13 @@ And speaking of confusing, some of you might have seen an error like `Type 'stri This was caused by Luau having both a primitive type `string` and a table type coming from `string` library. Since the way you can get the type of the `string` library table is by using `typeof(string)`, the updated error message will mirror that and report `Type 'string' could not be converted into 'typeof(string)'`. -## Analysis improvements -For better inference, we updated definition of `Enum.SomeType:GetEnumItems()` to return `{Enum.SomeType}` instead of common `{EnumItem}` and the return type of `next` function now includes the possibility of key being `nil`. - -If you use `and` operator on non-boolean values, `boolean` type will no longer be added by the type inference: +Parsing now recovers with a more precise error message if you forget a comma in table constructor spanning multiple lines: ```lua -local function f1(a: number?) - -- 'x' is still a 'number?' and doesn't become 'boolean | number' - local x = a and 5 -end +local t = { + a = 1 + b = 2 -- Expected ',' after table constructor element + c = 3 -- Expected ',' after table constructor element +} ```