TS2339: Property does not exist on type 'CombinedVueInstance<Vue, unknown, ...>'的解決方案

Vue + TypeScript的項目裏,在watch裏使用data裏定義的數據的時候,發現類型消失了,出現了這個報錯:TS2339: Property does not exist on type 'CombinedVueInstance<Vue, unknown, unknown, unknown, Readonly<{ ... }>>'

查了一些資料之後,發現是因爲computed沒有顯式聲明返回類型。官方文檔是這麼說的:

因爲 Vue 的聲明文件天生就具有循環性,TypeScript 可能在推斷某個方法的類型的時候存在困難。因此,你可能需要在 rendercomputed 裏的方法上標註返回值。

const Component = Vue.extend({
  computed: {
    // 需要標註
    greeting(): string {
      return this.greet() + '!'
    }
  }
})

所以只需要在computed裏的屬性後面指明返回類型就好了。

其實仔細想想也很正常,因爲沒有顯式聲明類型的言下之意就是交給編譯器進行推導,當computed裏用到this的時候,如果想要知道computed的類型,就得知道this的類型,而如果想知道this的類型,又得知道computed的類型,就變成雞生蛋蛋生雞的問題了,所以需要顯式聲明類型來打破這個循環。顯式聲明類型之後,computed的類型就確定了,this的類型也就隨之確定了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章