理解 Redux 中的 StateFromReducersMapObject 类型

Understanding StateFromReducersMapObject type in Redux

我正在尝试阅读 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

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

谁能给我解释一下这是怎么回事?

Here is the full source code。提前谢谢你。

?是条件类型introduced in TypeScript 2.8

例如:

T extends U ? X : Y

在这个简化的示例中,如果 T extends U(又名 T 可分配给 U),则 T 的类型为 X。否则,如果不是,则 TY.

类型

那么在你的情况下:

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

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

在本例中,它是一个嵌套的条件类型,因此 with M[P] extends Reducer<infer S, any> ? S : never 也被评估。因此,如果 M[P] 可分配给 Reducer<infer S, any>,则 M[P]S,否则为 never.