打字新手.我和移动一个项目到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 它,它推断出正确的类型.但如果我仍然收到错误.我相信这个问题有一个简单的答案.

提前谢谢您.

推荐答案

这确实为您提供了适合为您调用setFilter操作创建器的"外部API形状",但在您的setFilter Reducer函数中,该代码太过通用,无法通过类型脚本正确键入.

TypeScrip对您的帮助是有限度的,而您远远超出了这个限度--您的代码太通用了.你得打几个any,然后就到此为止了. as any的意思是"我比编译器知道得更多",在这种情况下,这就是您所能做的全部.

Javascript相关问答推荐

React Hooks中useState的同步问题

如何修复循环HTML元素附加函数中的问题?

从PWA中的内部存储读取文件

useNavigation更改URL,但不呈现或显示组件

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

我可以从React中的出口从主布局调用一个处理程序函数吗?

使用useEffect,axios和useParams进行react测试

在WordPress中使用带有WPCode的Java代码片段时出现意外令牌错误

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何使用JS创建一个明暗功能按钮?

Vaadin定制组件-保持对javascrip变量的访问

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

按下单键和多值

未捕获的运行时错误:调度程序为空

将嵌套数组的元素乘以其深度,输出一个和

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

为什么这个最小Angular 的Licial.dev设置不起作用?

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

在Reaction Native中,ScrolltoIndex在结束时不一致地返回到索引0