クラスとインターフェース デザインパターン、型安全なビルダーパターンの設計
プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発(Boris Cherny(著)、今村 謙士(監修)、原 隆文(翻訳)、オライリー・ジャパン)の5章(クラスとインターフェース)、5.13(練習問題)4-aの解答を求めてみる。
コード
class RequestBuilder {
protected data: object | null = null
protected method: 'get' | 'post' | null = null
protected url: string | null = null
setMethod(method: 'get' | 'post'): RequestBuilderMethod {
return new RequestBuilderMethod().setMethod(method)
}
setData(data: object | null): this {
this.data = data
return this
}
}
class RequestBuilderMethod extends RequestBuilder {
setMethod(method: 'get' | 'post' | null): this {
this.method = method
return this
}
setURL(url: string): RequestBuilderMethodURL {
return new RequestBuilderMethodURL()
.setMethod(this.method)
.setURL(url)
.setData(this.data)
}
}
class RequestBuilderMethodURL extends RequestBuilderMethod {
setURL(url: string): this {
this.url = url
return this
}
send() {
console.log(this)
}
}
new RequestBuilder()
.setMethod('get')
.setURL('/users')
.setData({ firstName: 'Anna' })
.send()
// 以下はエラー
// new RequestBuilder()
// .setMethod('get')
// .setData({ firstName: 'Annna' })
// .send()
入出力結果(Terminal, Zsh)
% ts-node sample4.ts
RequestBuilderMethodURL {
data: { firstName: 'Anna' },
method: 'get',
url: '/users'
}
%