Hi, I’m trying to use strict type checking, and creating custom types using unions but the type checker says it is expecting a table type as opposed to the custom type I’ve declared it as, and I’m not sure why.
function onVariableChanged(Variable: VariableType, newValue: ValueType)
if (type(newValue) == type(Variable.Value)) then
**Variable.Value** = newValue
return Anim:WarnCode(0x60)
else
return Anim:WarnCode(0x61, true, "Type of value doesn't match value type accepted by variable type.")
end
end
Type error is specifically where I’ve double star quoted.
Actually, pretty sure this is just a limitation of the type system + a bad/wrong error message.
Without generics, which are currently disabled in functions and wouldn’t be flexible enough for this anyways, I don’t think this is currently possible.
What you want to do is something like this in TypeScript:
// typescript not lua
type ValueBase = {
Value: any;
}
type CFrameValue = {
Value: "CFrame"
}
type BoolValue = {
Value: "Bool"
}
function onVariableChanged<VariableType extends ValueBase>(Variable: VariableType, newValue: VariableType["Value"]) {
Variable.Value = newValue;
}
But roblox’s type system isn’t quite that powerful yet.
Since your code is sound you can just use a hack type assertion:
function onVariableChanged(Variable: VariableType, newValue: any)
if (typeof(newValue) == typeof(Variable.Value)) then
(Variable :: any).Value = newValue
return Anim:WarnCode(0x60)
else
return Anim:WarnCode(0x61, true, "Type of value doesn't match value type accepted by variable type.")
end
end