npm 包 redux-typescript-reducers 使用教程

阅读时长 9 分钟读完

在前端开发中,我们经常需要使用 Redux 管理应用程序的状态。而随着 TypeScript 在前端开发中的应用越来越广泛,使用 TypeScript 来编写 Redux 的代码也变得越来越普遍。

redux-typescript-reducers 这个 npm 包提供了一种更加优雅的方式来使用 TypeScript 来编写 Redux reducers。它能够帮助我们减少模板代码以及提高类型安全性,极大地提高了开发效率。

在本文中,我们将为大家详细介绍如何使用 redux-typescript-reducers

安装

使用 npmyarn 可以非常轻松地安装 redux-typescript-reducers,具体命令如下:

或者:

使用方法

假设我们的 Redux state 是这样的:

现在我们需要编写一个 reducer 来处理对应的 action。如果使用普通的 Redux reducers,我们需要编写下面这样一段代码:

-- -------------------- ---- -------
---- ---------- -
  --------- - ------------
  --------- - ------------
-

--------- --------------- -
  ----- ---------------------
-

--------- --------------- -
  ----- ---------------------
-

---- ------ - --------------- - ----------------

-------- -------------- ------ ------- -------- ----- -
  ------ ------------- -
    ---- ---------------------
      ------ -
        ---------
        ------ ----------- - --
      --
    ---- ---------------------
      ------ -
        ---------
        ------ ----------- - --
      --
    --------
      ------ ------
  -
-

可以看到,在这个 reducer 中,我们定义了多个 action 类型,并且在 reducer 中对这些 action 进行了处理。但是这样做存在两个问题:

  1. 代码量过多,且不易维护。

  2. 类型安全性不够高,容易出现类型错误。

而当我们使用 redux-typescript-reducers 时,这段代码可以变成这样:

-- -------------------- ---- -------
------ - ------------- - ---- ----------------------------

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- ------- - ------------------------
  ----------
  ----------
---

可以看到,代码量大大减少,并且我们只需要将每个操作以函数的形式定义出来即可。

createReducer

createReducerredux-typescript-reducers 中最为核心的 API,它是用来创建 reducer 的。它接受一个类型参数,表示我们的 state 类型,返回一个函数,用来创建 reducer。

接下来我们来看一下 createReducer 的详细用法。

usage

createReducer 接受两个参数:一个是 config,一个是 initialState

config 是一个对象,它包含了 reducer 中的所有 action 的处理函数。这个对象的每个属性名都是一个 action 类型,属性值是一个函数,这个函数接受 state 并返回新的 state。

initialState 是可选的,表示我们的 state 的初始值。如果不传这个参数,则默认为 {}

这个函数返回一个 reducer。

示例代码

-- -------------------- ---- -------
------ - ------------- - ---- ----------------------------

--------- ----- -
  ------ -------
-

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- ------- - ------------------------
  ----------
  ----------
---

这里,我们定义了一个 State 类型,同时定义了两个操作,增加计数和减少计数。我们使用 createReducer 来创建 reducer,然后把两个操作传进去。

getType

在大多数情况下,我们的 action 类型通常会被定义为字符串常量。在 TypeScript 中,我们通常使用枚举类型来定义字符串常量,比如:

-- -------------------- ---- -------
---- ---------- -
  --------- - ------------
  --------- - ------------
-

--------- --------------- -
  ----- ---------------------
-

--------- --------------- -
  ----- ---------------------
-

---- ------ - --------------- - ----------------

然而,枚举类型不仅过于臃肿,而且并没有非常良好的类型安全性。 redux-typescript-reducers 提供了 getType 函数来解决这个问题,它可以将字符串常量转换成与其关联的 action 类型。具体用法如下:

usage

本函数接受一个字符串常量,并返回一个与其关联的 action 类型。它具有一个类型参数 T,用来表示字符串常量的类型。

示例代码

-- -------------------- ---- -------
------ - -------------- ------- - ---- ----------------------------

--------- ----- -
  ------ -------
-

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- ------- - ------------------------
  ----------------------- ----------
  ----------------------- ----------
---

在这个例子中,我们使用 getType 函数将字符串常量 "increment""decrement" 转换为对应的 action 类型,并将它们作为对象的属性名。

getInitialState

在某些情况下,需要在创建 reducer 的时候指定初始状态。这时我们可以使用 getInitialState 函数。

usage

这个函数接受一个类型参数 T,表示我们要指定的状态的类型,返回一个函数,在由 createReducer 创建的 reducer 中会被调用。getInitialState 的返回值即为自定义的状态初始值。

示例代码

-- -------------------- ---- -------
------ - -------------- --------------- - ---- ----------------------------

--------- ----- -
  ------ -------
-

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- --------- - ------- ------ -- --
  ---------
  ------ ----------- - --
---

----- ------- - -----------------------
  -
    ----------------------- ----------
    ----------------------- ----------
  --
  ------------------------ ------ - --
--

在这里,我们使用 getInitialState 函数来指定 state 的初始值,这里我们将初始值设置为 { count: 0 }

总结

在本文中,我们介绍了 redux-typescript-reducers 这个 npm 包的使用方法。这个包可以帮助我们快速编写类型安全的 Redux reducers,减少模板代码。我们了解了其中最核心的 API createReducer,以及其它一些常用的 API,如 getTypegetInitialState

当然,我们在实际开发中也可以使用其它的库来编写 Redux reducers,比如 immer,其可以帮助我们简化 reducer 的编写,具体使用方法可以参考官方文档。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005551281e8991b448d245d

纠错
反馈