使用Typescript设置ContextApi和useReducer时出现“没有重载匹配此调用”错误

时间:2020-05-09 09:31:54

标签: reactjs typescript context-api

我试图用Typescript设置ContextApi和useReducer。在useReducer的“ issuesInitialState”变量上,出现错误:

没有重载匹配此调用。 重载1,共5个,'((reducer:({state,action}:IssueReducer)=> {},initializerArg:从不,initializer ?:未定义):[never,DispatchWithoutAction]',出现以下错误。 类型“ IssuesInitialState”的参数不能分配给类型“从不”的参数。 重载2之5,'((reducer:({state,action}:IssueReducer)=> {},initialState:never,initializer ?: undefined):[never,Dispatch]',出现以下错误。 不能将类型为“ IssuesInitialState”的参数分配给类型为“从不”的参数。ts(2769)

// Store.tsx
type Issue = {
  closeDate: string | null;
  description: string;
  issueId: number;
  lastEditDate: string | null;
  priorityId: string;
  projectId: number;
  reportDate: string;
  statusId: string;
  title: string;
  userId: number;
};

interface IssuesInitialState {
  issues: Issue[];
  issue: Issue;
  issuesByProject: Issue[];
  updateIssue: Issue;
}

const issuesInitialState: IssuesInitialState = {
  issues: [],
  issue: {
    closeDate: "",
    description: "",
    issueId: 0,
    lastEditDate: "",
    priorityId: "",
    projectId: 0,
    reportDate: "",
    statusId: "",
    title: "",
    userId: 0,
  },
  issuesByProject: [],
  updateIssue: {
    closeDate: "",
    description: "",
    issueId: 0,
    lastEditDate: "",
    priorityId: "",
    projectId: 0,
    reportDate: "",
    statusId: "",
    title: "",
    userId: 0,
  },
};

export const IssuesContext = createContext<{
  issuesState: IssuesInitialState;
  issuesDispatch: any;
}>({ issuesState: issuesInitialState, issuesDispatch: () => null });

export function StoreProvider({ children }: any): JSX.Element {
  const [commentsState, commentsDispatch] = useReducer(
    commentsReducer,
    commentsInitialState
  );
  const [issuesState, issuesDispatch] = useReducer(
    issuesReducer,
    issuesInitialState // where the error is!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  );
// IssuesReducer.ts
interface IssueReducer {
  state: IssuesInitialState;
  action: {
    type: string;
    payload: Issue;
  };
}

export const issuesReducer = ({ state, action }: IssueReducer): {} => {
  switch (action.type) {
    case FETCH_ISSUES:

2 个答案:

答案 0 :(得分:2)

马丁·洛克特(Martin Lockett)指出,除了返回类型是一个空对象之外,减速器是一个带有单个参数的函数,该参数是具有状态和动作属性的对象,实际上它应该是一个带有两个参数的函数,首先一个是状态,第二个是动作。它可能会帮助您像这样键入减速器:

import { Reducer } from 'react'

type IssuesAction = {
  type: string;
  payload: Issue;
}

export const issuesReducer: Reducer<IssuesInitialState, IssuesAction> = (state, action) => {
  switch (action.type) {
...

答案 1 :(得分:0)

您已将减速器返回类型定义为{},该类型与IssuesInitialState不兼容,因为类型的属性不是可选的。将您的reducer返回类型定义为状态类型