打字新手.我和移动一个项目到TS,当我使用redux-TOOLKIT创建切片时,我正在努力定义我的缩减器的打字脚本.场景是我将筛选器存储在一个州中.我有一个查询字符串和一个字段对象,如果值存在,这些字段将被过滤.每个字段的类型取决于该字段中存储的数据.为了设置字段筛选器值,我创建了一个缩减器,它接受键和值对作为有效负载.然后我使用它来设置该字段的筛选器值.经过我所有的谷歌,聊天和双子座,我仍然得到以下错误.
Type 'string | string[]' is not assignable to type 'string[] & string'.
Type 'string' is not assignable to type 'string[] & string'.
Type 'string' is not assignable to type 'string[]'.ts(2322)
(property) filters: WritableDraft<FilterValues>
这是切片的代码.我已经为setFilter和emoveFilter的有效负载try 了多种类型,并留下了两个setFilter来显示我try 过的内容.
import { PayloadAction, createSelector, createSlice } from '@reduxjs/toolkit';
import { RootState } from "redux/store";
export type FilterValues = {
tags_map: string[];
reference: string;
time_executed: string;
type: string;
}
interface State {
filterQuery: string;
filters: FilterValues;
}
const initialState:State = {
filterQuery: '',
filters: {
tags_map: [],
reference: '',
time_executed: '',
type: '',
},
};
type KeyValuePayload<T> = {
[K in keyof T]: {
key: K;
value: T[K]
}
}[keyof T];
export const slice = createSlice({
name: 'filters',
initialState,
reducers: {
setFilterQuery: (state, { payload }) => {
state.filterQuery = payload
},
// setFilter : (state, { payload }: PayloadAction<{ key: keyof FilterValues, value: FilterValues[keyof FilterValues] }>) => {
// state.filters[payload.key] = payload.value
// },
setFilter : (state, { payload }: PayloadAction<KeyValuePayload<FilterValues>>) => {
const { key, value } = payload
state.filters[key] = value
},
removeFilter: (state, { payload }: PayloadAction<keyof FilterValues>) => {
state.filters[payload] = initialState.filters[payload]
},
removeAllFilters: (state) => {
return { ...state, filters: initialState.filters }
},
},
});
export const {
setFilterQuery,
setFilter,
removeFilter,
removeAllFilters,
} = slice.actions;
export default slice. Reducer;
样本有效载荷
setFilter({key: "reference", value: "foobar"})
setFilter({key: "tags_map", value: ["foo", "bar"]})
我不知所措.我使用了在这个answer中解释的方法,并在TS playground中try 它,它推断出正确的类型.但如果我仍然收到错误.我相信这个问题有一个简单的答案.
提前谢谢您.