Vue + TypeScript的項目裏,在watch裏使用data裏定義的數據的時候,發現類型消失了,出現了這個報錯:TS2339: Property does not exist on type 'CombinedVueInstance<Vue, unknown, unknown, unknown, Readonly<{ ... }>>'
。
查了一些資料之後,發現是因爲computed沒有顯式聲明返回類型。官方文檔是這麼說的:
因爲 Vue 的聲明文件天生就具有循環性,TypeScript 可能在推斷某個方法的類型的時候存在困難。因此,你可能需要在
render
或computed
裏的方法上標註返回值。const Component = Vue.extend({ computed: { // 需要標註 greeting(): string { return this.greet() + '!' } } })
所以只需要在computed裏的屬性後面指明返回類型就好了。
其實仔細想想也很正常,因爲沒有顯式聲明類型的言下之意就是交給編譯器進行推導,當computed裏用到this的時候,如果想要知道computed的類型,就得知道this的類型,而如果想知道this的類型,又得知道computed的類型,就變成雞生蛋蛋生雞的問題了,所以需要顯式聲明類型來打破這個循環。顯式聲明類型之後,computed的類型就確定了,this的類型也就隨之確定了。