Restricting the type of a generic function

I’m making this function to calculate the internal angle of three points:

function InternalAngle<T>(p1: T, p2: T, p3: T): number
	-- https://youtu.be/vUQo7HVCx8A
	local p1p2 = p2 - p1
	local p1p3 = p3 - p1
	
	return math.acos(p1p2:Dot(p1p3) / (p1p2.Magnitude * p1p2.Magnitude))
end

However, luau is complaining that Type 'T' could not be converted into 'number'.
How do I make it clear that T must be either a Vector2 or a Vector3?

Somewhat solved this:

--!strict

function InternalAngle<T>(p1: T & (Vector2 | Vector3), p2: T & (Vector2 | Vector3), p3: T & (Vector2 | Vector3))
	-- https://youtu.be/vUQo7HVCx8A
	local p1p2 = p2 - p1
	local p1p3 = p3 - p1
	
	return math.acos(p1p2:Dot(p1p3) / (p1p2.Magnitude * p1p2.Magnitude))
end

InternalAngle(Vector3.new(0, 0, 0), Vector3.new(0, 0, 0), Vector3.new(0, 0, 0))
-- no warning

InternalAngle(Vector3.new(0, 0, 0), Vector2.new(0, 0), Vector3.new(0, 0, 0))
-- Type 'Vector2' could not be converted into type 'Vector3'

InternalAngle(Vector2.new(0, 0), Vector2.new(0, 0), Vector3.new(0, 0, 0))
-- Type 'Vector3' could not be converted into type 'Vector2'

This does, however, make the entire function body very angry.
It keeps thinking that p1p2 and p1p3 is a number for some reason.
I don’t care though.