Open
Description
Description
pcall()
is declared to return LuaMultiReturn<[true, R] | [false, string]>
, but in Lua, the error object can be anything. This leads to problem when the error object is used in a context where it matters whether it can be something other than a string.
To reproduce
Consider the following example (playground):
function foo(this: void) {
throw {}
}
let result = pcall(foo)
if (!result[0]) {
print("error: " + result[1])
}
Function foo()
throws an empty object. To allow concatenation with a string, a call to tostring()
needs to be inserted, but it isn't. So the concatenation in the argument to print()
fails:
Lua execution error:
[string "--[[ Generated with https://github.com/TypeSc..."]:7: attempt to concatenate a table value (field '?')
If the correct type is added to the declaration of result
, the call to tostring()
is inserted:
let result: [true, void] | [false, unknown] = pcall(foo)
Generated code:
--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]
function foo()
error({}, 0)
end
result = {pcall(foo)}
if not result[1] then
print("error: " .. tostring(result[2]))
end
Expected behavior
I think that the return type of pcall()
should be changed to LuaMultiReturn<[true, R] | [false, unknown]>
. The same applies to coroutine.resume()
.
Metadata
Metadata
Assignees
Labels
No labels