【问题标题】:Understanding StateFromReducersMapObject type in Redux了解 Redux 中的 StateFromReducersMapObject 类型
【发布时间】:2020-01-10 06:19:43
【问题描述】:

我正在尝试阅读 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。提前谢谢你。

【问题讨论】:

    标签: typescript redux typescript-generics


    【解决方案1】:

    ? 是条件类型introduced in TypeScript 2.8

    例如:

    T extends U ? X : Y
    

    在这个简化的示例中,如果 T extends U(又名 T 可分配给 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&lt;any, any&gt;(又名M 可分配给ReducersMapObject&lt;any, any&gt;)则M{ [P in keyof M]: M[P] extends Reducer&lt;infer S, any&gt; ? S : never },否则Mnever

    在这种情况下,它是一个嵌套的条件类型,所以 M[P] extends Reducer&lt;infer S, any&gt; ? S : never 也会被计算。因此,如果M[P] 可以分配给Reducer&lt;infer S, any&gt;,那么M[P] 就是S,否则就是never

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2022-08-19
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多