typescript - 是否可以将广义类型转换为联合
问题描述
请告诉我是否可以在不手动指定特定值的情况下推断最后一种类型(任务)?
interface Action {
move: number,
eat: string
}
interface Task<A extends keyof Action> {
action: A,
value: Action[A],
}
type Tasks = Task<'move'> | Task<'eat'>;
解决方案
您可以创建一个“人为的”分布式条件类型Task
,以便为每个键创建一个联合类型Action
。所以你不需要Task<"move"> | ... | Task<"other Action keys">
手动设置:
type DesiredTasks = keyof Action extends infer I ? I extends keyof Action ? Task<I> : never : never
// type DesiredTasks = Task<"move"> | Task<"eat">
// same as { action: "move"; value: number; } | { action: "eat"; value: string; }
为什么不Task<keyof Action>
呢?
所有属性值类型都合并在一起,例如可区分的联合类型将不再起作用:
type Tasks = Task<keyof Action> // {action: "move" | "eat"; value: string | number; }
declare const t1: Tasks
if (t1.action === "eat") t1.value // value: string | number, no good...
declare const t2: DesiredTasks
if (t2.action === "eat") t2.value // value: string ✔
推荐阅读
- http - 带有图像附件的 Julia HTTP POST 请求
- javascript - 在 Angular 表单验证器中使用变量
- c - 函数重载不适用于 c 中的命名空间(结构)
- linux - 如何在 Yocto 中正确构建 mDNS?
- javascript - 意外的标识符 为什么它不起作用?
- python - Python FPDF忽略封面页中的页眉和页脚
- javascript - 无法实例化类并将其添加到数组中 - 对象属性始终为 0?
- python - 为什么在 lambda 中使用 ssh 调用时我的 python 代码中的 api 调用不起作用
- python - 在“ExcelWriter”下方编写代码 - Python/Openpyxl
- database - cloud firestore 基于角色的访问示例:用户可以创建评论吗?