JavaScript
TypeScript
es6

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

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


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

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

interface UserType {
  name: string
  age: number
}

class User implements UserType {
  name: string
  age: number
  constructor(user: UserType) {
    Object.assign(this, hoge)
  }
}

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

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

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

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

class User implements UserType {
  constructor(
    name: string,
    age: number
  ) {
    this.name = name
    this.age = age
  }
}

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

interface UserType {
  name: string
  age: number
}

class User implements UserType {
  name: string
  age: number
  constructor(user: UserType) {
    Object.assign(this, user)
  }
}

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

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