Vue.set - TypeScript推断的错误类型

时间:2018-05-03 09:15:14

标签: typescript vue.js vuex

我在变异中创建一个Vuex模块我使用一个键将对象设置为另一个对象:obj [key] = newobj。我也在这里使用打字稿。

假设:

copy

TypeScript给我一个错误:

// store state interface
export interface Office {
    id: number;
    name: string;
    zip?: string;
    city?: string;
    address?: string;
    phone?: string;
    phone2?: string;
}

export interface Organization {
    [key: string]: any;

    id: number;
    name: string;
    offices: { [key: string]: Office };
}

// store action
const setOffice = (state: OrganizationState, item: Office) => {
    Vue.set<Office>(state.offices, item.id, item);
    // or, it does not change much
    Vue.set(state.offices, item.id, item);
};

enter image description here

在打字中有2个版本的Vue.set - 一个用于对象,一个用于数组:

25:19 Argument of type '{ [key: string]: Office; }' is not assignable to parameter of type 'Office[]'.
Property 'includes' is missing in type '{ [key: string]: Office; }'.

    23 | 
    24 | const setOffice = (state: OrganizationState, item: Office) =>{
  > 25 |     Vue.set<Office>(state.offices, item.id, item);
       |                   ^
    26 | };

就我而言,它总是使用类型 array

1 个答案:

答案 0 :(得分:4)

问题是你的第二个参数(item.id)是一个数字,这使得调用与第一个重载不兼容,第一个重载需要string作为第二个参数。

简单的解决方案是将id转换为通话中的string

Vue.set<Office>(state.offices, item.id.toString(), item);