計算機科学のブログ

クラスとインターフェース デザインパターン、ファクトリーパターン、実装、拡張、オーバーロードされた関数の型

プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発(Boris Cherny(著)、今村 謙士(監修)、原 隆文(翻訳)、オライリー・ジャパン)の5章(クラスとインターフェース)、5.13(練習問題)3の解答を求めてみる。

コード

type Shoe = {
    purpose: string
}
class BalletFlat implements Shoe {
    purpose = 'dancing'
}

class Boot implements Shoe {
    purpose = 'woodcutting'
}

class Sneaker implements Shoe {
    purpose = 'walking'
}

type Create = {
    create(type: 'balletFlat'): BalletFlat
    create(type: 'boot'): Boot
    create(type: 'sneaker'): Sneaker
}

let Shoe: Create = {
    create(type: 'balletFlat' | 'boot' | 'sneaker'): Shoe {
        switch (type) {
            case 'balletFlat':
                return new BalletFlat
            case 'boot':
                return new Boot
            case 'sneaker':
                return new Sneaker
        }
    }
}

let balletFlat = Shoe.create('balletFlat')
let boot = Shoe.create('boot')
let sneaker = Shoe.create('sneaker')

for (const shoe of [balletFlat, boot, sneaker]) {
    console.log(shoe)
}

入出力結果(Terminal, Zsh)

% ts-node sample3.ts
BalletFlat { purpose: 'dancing' }
Boot { purpose: 'woodcutting' }
Sneaker { purpose: 'walking' }
%