Typescript/クラス

src/oop/shogi.ts
type Suji = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 
type Dan = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" 
type Player = "first" | "second"

class Position {
    constructor(private suji: Suji, private dan: Dan){

    }
    distanceFrom(position: Position, player: Player){
        if(player === "first"){
            return {
                suji: Math.abs(position.suji - this.suji),
                dan: Math.abs(Number(position.dan) - Number(this.dan))
            }
        } else {
            return{
                suji: Math.abs(position.suji - this.suji),
                dan: -(Math.abs(Number(position.dan) - Number(this.dan)))
            }
        }
    }
}

abstract class Piece {
    protected position: Position

    constructor(private readonly player:Player, suji: Suji, dan: Dan){
        this.position = new Position(suji, dan)
    }

    movTo(position: Position){
        this.position = position
    }

    abstract canMoveTo(position: Position, player: Player): boolean
}

class Osho extends Piece {
    canMoveTo(position: Position, player: Player): boolean{
        const distance = this.position.distanceFrom(position, player)
        return (distance.suji < 2 && distance.dan < 2)
    }
}

class Game {
    private pieces = Game.makePieces()
    private static makePieces(){
        return [
            new Osho("first", 5, "1"),
            new Osho("second", 5, "9")
        ]
    }
}