溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue+ts里面this.$store問題怎么解決

發布時間:2022-03-30 16:47:29 來源:億速云 閱讀:531 作者:iii 欄目:開發技術

這篇文章主要介紹了Vue+ts里面this.$store問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Vue+ts里面this.$store問題怎么解決文章都會有所收獲,下面我們一起來看看吧。

Vue+ts里this.$store問題

vuex里面我調用this.$store訪問倉庫state時,調用失敗報錯

解決辦法

(this as any).$store

Vue實踐ts中的一些常見錯誤及解決

mixin報錯

import { Component, Prop, Vue ,Mixins} from 'vue-property-decorator'
import httpminix from '../mixin/httpMixin'
@Component({
  mixins:[httpminix]
})
export default class HelloWorld extends Vue {
  public async getUser() : Promise<void> {
    const r = await this.apiGet('/show') //HelloWorld上沒有apiGet方法
    this.firstName = JSON.stringify(r.data)
  }
}

解決方案

import { Component, Prop, Vue ,Mixins} from 'vue-property-decorator'
import httpminix from '../mixin/httpMixin'
@Component
// 這里從繼承Vue改成繼承Minix函數,這樣就有提示了
export default class HelloWorld extends Mixins(httpminix) {
  public async getUser() : Promise<void> {
    const r = await this.apiGet('/show')
    this.firstName = JSON.stringify(r.data)
  }
  public mounted() {
   this.getUser()
  }
}

擴展屬性報錯

我們現在代碼里寫一段window,然后用編輯器跳轉到其.d.ts文件中去

// 定義一個全局變量 window 類型為Window
declare var window: Window;
// 截取Window接口
interface Window

由于這個接口為全局接口,所以我們可以聲明一個同名全局全局接口,TS會幫我們合并

interface Window {
  // 也可以添加 
  // 字符串簽名 可以允許添加未知名稱屬性
  [p: string]: any
}
// 這樣就可以使用如下代碼不報錯
import axios from 'axios'
window.axios = axios

然后我們發現

window.axios //這里沒有屬性提示

然后我想把這個axios具體類型掛載上去,當然一想,像下面這樣做

import {AxiosStatic} from 'axios'
interface Window {
  axios: AxiosStatic
}

然后發現報錯了,window上沒有axios這個屬性,就很疑惑,嘗試改回去,仍然報錯

import {AxiosStatic} from 'axios'
interface Window {
  [p: string]: any
}

我就想這兩個區別就是導入了一個類型,突然想到

TS中沒有import和export的TS文件變量被視為全局

然后回去一看原本Window的定義

// 注意lib.dom.d.ts這里沒有export
interface Window

好的,想通了,就是因為使用import導入了一個類型,導致我自定義Window接口變成了模塊內的,這時候的解決方案當然是看看內置語法有沒有能顯示定義全局性的變量

// bingo  此時window.axios有提示啦
import { AxiosStatic } from "axios";
declare global {
  interface Window {
      axios: AxiosStatic
  }
}
export { };

TS為我們在模塊定義全局提供了一個方式,用于解決在模塊中擴展全局

declare global {
  // your type code
}

擴展Vue屬性例子

import Vue from 'vue'
declare module "vue/types/vue" {
  interface Vue {
    $message: string;
  }
}

在組件類中可以這樣訪問

this.$messgae //這里有屬性提示

總結:需要擴展一個第三方聲明文件,需要確定其命名空間以及擴展變量實現的接口結構,然后復制該接口寫一次自己的類型即可

關于“Vue+ts里面this.$store問題怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Vue+ts里面this.$store問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女