首页 > 解决方案 > 了解 Redux 中的 StateFromReducersMapObject 类型

问题描述

我正在尝试阅读 Redux 源代码,但我被困在下面的类型定义中src/types/reducers.ts

/**
 * Infer a combined state shape from a `ReducersMapObject`.
 *
 * @template M Object map of reducers as provided to `combineReducers(map: M)`.
 */
export type StateFromReducersMapObject<M> = M extends ReducersMapObject<
  any,
  any
>
  ? { [P in keyof M]: M[P] extends Reducer<infer S, any> ? S : never }
  : never

我被困在:

M extends ReducersMapObject<
  any,
  any
>
  ? { [P in keyof M]: M[P] extends Reducer<infer S, any> ? S : never }
  : never

这一行有一个?。这看起来像一个三元运算。

有人可以向我解释这里发生了什么吗?

这是完整的源代码。先感谢您。

标签: typescriptreduxtypescript-generics

解决方案


这是TypeScript 2.8 中引入?的条件类型。

例如:

T extends U ? X : Y

在这个简化的例子中,如果T extends U(aka Tis assignable to U) 那么 T 的类型是X。否则,如果不是,T则为 类型Y

所以在你的情况下:

M extends ReducersMapObject<
  any,
  any
>
  ? { [P in keyof M]: M[P] extends Reducer<infer S, any> ? S : never }
  : never

如果M extends ReducersMapObject<any, any>(akaM可分配给ReducersMapObject<any, any>)M则为{ [P in keyof M]: M[P] extends Reducer<infer S, any> ? S : never },否则Mnever

在这种情况下,它是一个嵌套的条件类型,所以 withM[P] extends Reducer<infer S, any> ? S : never也被评估。因此,如果M[P]可分配给Reducer<infer S, any>then M[P]is S,否则它是never


推荐阅读