typescriptでscalaのcase class#copyみたいなことがしたい
普段Scalaを書いている時にはcase class無しでは生きられないくらいお世話になっているわけですが、typescriptでもimmutableなcase classっぽいものを使いたいのです。
classをimmutableにするだけならコンストラクタ引数を全部`public readonlyにすれば良いだけなので簡単です。
class User {
constructor(
public readonly id: number,
public readonly name: string,
public readonly age: number
) {}
}
楽勝!
でもこれだけじゃ足りない。copy
メソッドも欲しい!どうしたものか。。。
と、考えた結果Partial
を使って自前実装するのが良いんじゃないかという結論にたどり着きました。
// 名前がcopyでないのは好みの問題です
public cloneWith(v: Partial<User>) {
return new User(
this.id,
v.name || this.name,
v.age || this.age,
)
}
なにげにid
は置き換え不可とかの制御ができるのも良いところだと思います。
問題があるとしたらコンストラクタ引数が増えるとそれに合わせてcloneWith
の方も直さないといけないのでタイプ量が増えるという点かと思いますが、今の時代もはやそれ、どうでもいいんじゃないですかね。
だって、コンストラクタの方にだけ引数足したらコンパイルエラーだし、しかも今の時代コンパイルせずともエディタがリアルタイムでエラーを指摘してくれるわけですし。補完も効くのでそうそうミスは起きません。
型のないpure javascriptだったらtypoの可能性があるので極力タイプ量を減らしたいというのはわかります。(他にも全フィールドに対してテスト書け、とか言われたりね)
しかし、IDE前提の現代のtypescriptでは変にループとreflection的なテクニックを駆使して汎化するよりもこれで十分じゃないの?と思ったりします。
Author And Source
この問題について(typescriptでscalaのcase class#copyみたいなことがしたい), 我々は、より多くの情報をここで見つけました https://qiita.com/shunjikonishi/items/9843927df142053a2b33著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .