19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vue.jsのdataオプションで型を宣言的に書く方法

Last updated at Posted at 2018-05-01

今回試してるVue.jsのバージョンは2.5で
vue-class-componentを使わず、Thisの型推論ができるコードを対象にしている
(また、strictもしくはnoImplicitThisをtrueにする必要あり)

宣言的でない例

以下の場合、dataオプションでcountの初期値に0を指定しているため、
addCount内でthis.countはnumber型と解釈される

export default Vue.extend({
  data() {
    return {
      count: 0
    }
  },
  computed: {
    addCount() {
      this.count += 1
    }
  },
  created() {
    this.addCount
    console.log(this.count) // 1が出力される
  }
})

よって、以下のようにcountを'a'に変更すると、this.countはstring型と解釈される
当然結果も文字列結合となり、a1と出力されてしまう

export default Vue.extend({
  data() {
    return {
      count: 'a'
    }
  },
  computed: {
    addCount() {
      this.count += 1
    }
  },
  created() {
    this.addCount
    console.log(this.count) // a1が出力される
  }
})

この結果は予期せぬ結果かもしれないので、コンパイル時に気付けるようにしたい

dataオプション内のプロパティの型を宣言的に書く

dataオプションを以下のように書くことで、countがnumber型であると明示的に書ける
単純にdataオプションは関数なので、その戻り値の型を定義してあげてるだけ

export default Vue.extend({
  data(): {
    count: number
  } {
    return {
      count: 0
    }
  },
  computed: {
    addCount() {
      this.count += 1
    }
  },
  created() {
    this.addCount
    console.log(this.count) // 1が出力される
  }
})

先程の例のようにcountに'a'などnumber型以外の値を設定しようとするとコンパイルエラーになる
VSCodeであれば以下のようなエラーを出してくれる

 2018-05-01 18.54.13.png
19
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?