クラスとインターフェース デザインパターン、ファクトリーパターン、実装、拡張、オーバーロードされた関数の型
プログラミング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' }
%