計算機科学のブログ

クラスとインターフェース デザインパターン、型安全なビルダーパターンの設計

プログラミング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'
}
%