javascript - 使用 TypeScript 进行 Vuex 突变时,对象可能是 'undefined'

标签 javascript typescript vue.js vuex

我正在使用 Vuex 和 TypeScript 学习 Vue.js,在我正在构建的应用程序中,我在 Vuex 商店中遇到了错误“对象可能是‘未定义’”。

错误发生在这一行的“newCard”突变中:

state.board.lists.find(list => list.id === idList).cards.unshift(card)

完整的商店代码:

const state: BoardState = {
  board: {
    id: "",
    name: "",
    idProject: "",
    closed: false,
    lists: []
  }
};

const getters: GetterTree<BoardState, {}> = {
  getBoard: state => state.board
};

const mutations: MutationTree<BoardState> = {
  setBoard: (state, board) => (state.board = board),
  newList: (state, list) => state.board.lists.unshift(list),
  newCard: (state, { card, idList }) =>
    state.board.lists.find(list => list.id === idList).cards.unshift(card)
};

const actions: ActionTree<BoardState, {}> = {
  async fetchBoard({ commit }) {
    const response = await axios.post("https://app.fakejson.com/q", json);
    commit("setBoard", response.data);
  },
  async addList({ commit }, list) {
    const response = await axios.post("https://app.fakejson.com/q", {
      token: "oplF0L7vj1Ial4cRqtx9DA",
      data: list
    });
    commit("newList", response.data);
  },
  async addCard({ commit }, { card, idList }) {
    const response = await axios.post("https://app.fakejson.com/q", {
      token: "oplF0L7vj1Ial4cRqtx9DA",
      data: card
    });
    commit("newCard", response.data, idList);
  }
};

TypeScript 类型:

// Store
export interface BoardState {
  board: Board;
}

// Models
export interface Board {
  id: String;
  name: String;
  idProject: String;
  closed: Boolean;
  lists: List[];
}

export interface List {
  id: String;
  name: String;
  idBoard: String;
  closed: Boolean;
  cards: Card[];
}

export interface Card {
  id: String;
  name: String;
  idList: String;
  closed: Boolean;
}

板子状态的响应数据是这样的:

 {
   "id":"1",
   "name":"Tasks",
   "idProject":"1",
   "closed":false,
   "lists":[
      {
         "id":"1",
         "name":"To Do",
         "idBoard":"1",
         "closed":false,
         "cards":[
            {
               "id":"1",
               "idList":"1",
               "name":"Card 1",
               "closed":false
            },
            {
               "id":"2",
               "idList":"1",
               "name":"Card 2",
               "closed":false
            }
         ]
      }
   ]
}

最佳答案

state.board.lists.find(list => list.id === idList).cards.unshift(card)

可能找不到具体列表。所以你将无法从中挑选卡片。

const list = state.board.lists.find(list => list.id === idList)

if (!list) {
    // do something
    return
}

// list found so return
return list.cards.unshift(card)

关于javascript - 使用 TypeScript 进行 Vuex 突变时,对象可能是 'undefined',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60712557/

相关文章:

php - 检测图像分辨率?

javascript - 从 Controller (Angular)为 IE9 设置动态图标

javascript - Bootstrap 按显示事件的类名查找事件选项卡内的元素。

typescript - Typescript 中的 Enzyme Jest React Redux 连接组件

javascript - typescript (类型 'undefined' 不可分配给类型)为什么我的数组有一个 |不明确的?

vue.js - Vue 转换适用于 "enter"状态,但不适用于 "leave"状态

javascript - 从 firebase 数据库中检索数据(在控制台中工作但在代码中不起作用)

javascript - Angular 4抛出无法与URL中的XSS脚本匹配任何路由错误

javascript - Vue2 - 将普通 ONKEYPRESS 函数转换为方法

vue.js - Vuejs 单选按钮检查 v-model 是否为数组