typescript - 了解 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
这一行有一个?
。这看起来像一个三元运算。
有人可以向我解释这里发生了什么吗?
这是完整的源代码。先感谢您。
解决方案
这是TypeScript 2.8 中引入?
的条件类型。
例如:
T extends U ? X : Y
在这个简化的例子中,如果T extends U
(aka T
is 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 }
,否则M
为never
。
在这种情况下,它是一个嵌套的条件类型,所以 withM[P] extends Reducer<infer S, any> ? S : never
也被评估。因此,如果M[P]
可分配给Reducer<infer S, any>
then M[P]
is S
,否则它是never
。
推荐阅读
- angular - 一旦有断线,垫排序标题单元格的额外宽度
- azure - 可以将 AZURE 应用服务定义为 VNET 的一部分吗?
- java - 如何使用 @UniqueConstraint 和 @Column(unique = true) 返回自定义消息
- gcloud - Linux 上的 Gcloud 组件
- python - 如何将数字列表四舍五入到一组允许的数字
- node.js - Wkhtmltopdf - Aws Lambda 超时
- excel - VBA 其他人正在“NETWORK_DRIVE_EXCELFILE.xlsm”中工作。请稍后再试
- r - 使用“交互”包在 R 中创建多面图 2 向交互
- java - 有效管理 HttpClients 池
- javascript - 用于 woocommerce 产品过滤器的 Ajax 不起作用有什么建议吗?