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().
Description
pcall()is declared to returnLuaMultiReturn<[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()throws an empty object. To allow concatenation with a string, a call totostring()needs to be inserted, but it isn't. So the concatenation in the argument toprint()fails:If the correct type is added to the declaration of
result, the call totostring()is inserted:Generated code:
Expected behavior
I think that the return type of
pcall()should be changed toLuaMultiReturn<[true, R] | [false, unknown]>. The same applies tocoroutine.resume().