I think the problematic part is the example below:
return this.#x === other.#x && this.#y === other.#y;
Here you implicitly assume that
other has the same type as
this. This is the place where the “early error” approach enters the “static typing” zone, and the lines get blurred.