blog.euxn.me

TypeScript で JSON を class property に代入するのに Object.assign を使う手法

2018-09-06 Thu.

※ 09/13 追記 この方法だと strict な型検査ができないようです。


手法の 1 つとして発見したのですが、これが正しいかわからないのでご意見ください。(というか、ご意見が欲しくて書いた) TypeScript と書いたが、 babel でも動くかもしれない。

前提として以下の interface / class を定義する。

1interface UserType {
2 name: string;
3 age: number;
4}
5
6class User implements UserType {
7 name: string;
8 age: number;
9 constructor(user: UserType) {
10 Object.assign(this, hoge);
11 }
12}

class 生成時に値をそのまま入れたい場合は、constructor に以下のように書くことで実現できる。

1class User implements UserType {
2 constructor(public name: string, public age: number) {}
3}

しかしこの方法の場合、 decorator を付与すると複雑になり、かつバグる。(バグらない場合もあるかもしれないが、自分が試したものはバグった)

これを回避するために、 constructor に引数で渡し、本文中で this に代入する一般的な方法もあるが、これでは constructor が膨大になってしまう。

1class User implements UserType {
2 constructor(name: string, age: number) {
3 this.name = name;
4 this.age = age;
5 }
6}

そこで完結に書きたく、 Object.assign を使用した

1interface UserType {
2 name: string;
3 age: number;
4}
5
6class User implements UserType {
7 name: string;
8 age: number;
9 constructor(user: UserType) {
10 Object.assign(this, user);
11 }
12}

プロパティが過剰でないことは interface を実装していることから保証できる、はずである。

現状問題なさそうだが、この手法の是非について自分だけでは判断できないため、ご意見頂ければと思います。