是否可以使用 typescript Union 类型来表示 Redux Toolkit Slice 的状态?

Swe*_*rij 3 javascript typescript reactjs redux-toolkit

我想在使用 Redux Toolkit 时使用这样的联合类型来表示切片的状态:

type AppState = { loading: true } | { loading: false; data: number };
Run Code Online (Sandbox Code Playgroud)

似乎在减速器文件中使用 Immerjs 阻止我在两个 Union 选项之间切换,例如:

import { createSlice, PayloadAction } from "@reduxjs/toolkit";

const initialState: AppState = { loading: true };

export const sampleSlice = createSlice({
  name: "sample",
  initialState,
  reducers: {
    setup: (state) => {
      return { loading: false, data: 5 };
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

这给了我以下打字稿错误:

Type '(state: WritableDraft<{ loading: true; }>) => { loading: false; data: number; }' is not assignable to type 'CaseReducer<{ loading: true; }, { payload: any; type: string; }> | CaseReducerWithPrepare<{ loading: true; }, PayloadAction<any, string, any, any>>'.
Run Code Online (Sandbox Code Playgroud)

有什么办法可以让这个工作吗?我当前的解决方法不是使用联合类型来表示状态,但我想知道是否有解决方法。我也尝试过不使用布尔值而是使用字符串作为键loading,但它会产生相同的错误。

sli*_*wp2 7

注意:根据文档,选项 2 是更好的方法。

选项1。提供 的通用参数类型createSlice

import { createSlice, SliceCaseReducers } from '@reduxjs/toolkit';

type AppState = { loading: true } | { loading: false; data: number };

const initialState: AppState = { loading: true };

type CaseReducers = SliceCaseReducers<AppState>;

export const sampleSlice = createSlice<AppState, CaseReducers>({
  name: 'sample',
  initialState,
  reducers: {
    setup: (state) => {
      return { loading: false, data: 5 };
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

state减速机型号:

在此输入图像描述

选项 2.投射初始状态。请参阅定义初始状态类型

import { createSlice, SliceCaseReducers } from '@reduxjs/toolkit';

type AppState = { loading: true } | { loading: false; data: number };

const initialState: AppState = { loading: true };

// type CaseReducers = SliceCaseReducers<AppState>;

export const sampleSlice = createSlice({
  name: 'sample',
  initialState: initialState as AppState,
  reducers: {
    setup: (state) => {
      return { loading: false, data: 5 };
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

软件包版本:

import { createSlice, SliceCaseReducers } from '@reduxjs/toolkit';

type AppState = { loading: true } | { loading: false; data: number };

const initialState: AppState = { loading: true };

type CaseReducers = SliceCaseReducers<AppState>;

export const sampleSlice = createSlice<AppState, CaseReducers>({
  name: 'sample',
  initialState,
  reducers: {
    setup: (state) => {
      return { loading: false, data: 5 };
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

  • 请不要执行选项 1。永远不应该使用手动通用注释来调用`createSlice`。这将删除有关其中操作的所有信息。来源:我为其编写了类型。选项 2 是我们文档的建议。 (3认同)