How exactly do metatables work with types?

Hi, I’ve made a class called Command to deal with type checking for functions that require a Command to work properly, and it’s defined as so:

export type Command = {
	Name: string,
	Description: string,
	Usage: string,
	Examples: {string},
	
	__call: (Player, ...any) -> (),
}

However, it looks like __call isn’t functioning properly, as anything that requires a function has an underline, like in this function:

local function parseArgsToCommand(fn: CommandType.Command, plr: Player, ...: any)
	local args: number, varargs: boolean = debug.info(fn, "a")
	
	-- do + 1 because the first arg is the player
	if not varargs and args ~= #... + 1 then
		warn("Function " .. fn.Name .. " expected " .. args .. " arguments, but got " .. #... + 1)
		return
	else
		fn(plr, ...)
	end
end

and I get the error ServerScriptService.Admin.Main:18: invalid argument #1 to 'info' (function or level expected). Does anybody know how I can make a type have an __call metatable? I could use a second type and make a constructor but that feels clunky.

What table has the ‘Command’ metatable been registered for?

the issue is that I’m not sure how to use something like setmetatable on a type that I purposefully do not have a new() method for

using something like this would require me to make a new() method, when I moreso just want this to be a type that works like a function with extra information, and the values manually set. If that’s not possible I guess I could find a workaround

band-aid solution was to just replace __call with fn and do Command.fn() instead, but I would prefer just being able to do Command().