typescript - 基于变量的条件类型
问题描述
我希望能够通过将一些变量传递给组件道具来从“类型映射”之类的东西中选择正确的类型。我将其称为“条件类型”,但我没有在 typescript 文档的相应页面上找到解决方案。
这是一个简化的示例:
type Queue1 = {};
type Queue2 = {};
type Queue3 = {};
// ... another possible type
type QueueTypes = {
'Queue1': Queue1,
'Queue2': Queue2,
'Queue2': Queue3
// ...
}
interface Props {
queueType: keyof QueueTypes;
}
let props: Props = {queue: 'Queue2'}
// Type 'any' cannot be used as an index type
type rightQueueType = QueueType[props.queue]
经过一个小时的谷歌搜索,我从未找到正确的解决方案。也许我以某种错误的方式使用打字稿?我很乐意得到任何帮助。
链接到操场
Upd:我有一个可重用的通用反应组件(表),可以处理不同类型的资源(队列 1、队列 2 等)。我无法明确提供资源类型,因为它是动态的。所以我所拥有的只是一个作为字符串的资源类型,我需要以某种方式将其转换/转换为现有的打字稿类型。根据我最初的游乐场,它可能看起来像这样:/>(React 组件)
我最终采用了这种方法(感谢@jcalz):
interface Queue1 { q: 1 }
interface Queue2 { q: 2 }
interface Queue3 { q: 3 }
type QueueTypes = {
'Queue1': Queue1,
'Queue2': Queue2,
'Queue3': Queue3
}
type Props = { [K in keyof QueueTypes]: { queueType: K } }[keyof QueueTypes]
let props: Props = { queueType: 'Queue2' }
// <ResourceTable<QueueTypes[typeof props.queueType]>>
解决方案
可以使用 Record 是一个对象类型,其属性键为 K,属性值为 T。也就是说,keyof Record 等价于 K,Record[K] 等价于 T。
type QueueTypes: Record<string, Queue1 | Queue2 | Queue3> = {
'Queue1': Queue1,
'Queue2': Queue2,
'Queue2': Queue3
}
推荐阅读
- reporting-services - 如何在 SSRS 报告中实现类似 Excel 的条件格式和“色标”
- javascript - ES6:自导入与订购导出以供参考
- c# - 其他 Datagrid 中的 WPF Datagrid
- r - 创建一个闪亮的应用程序,当输入 URL 时,可以下载一个 csv 文件
- java - 删除 VS Code PROBLEMS 窗口中的 Java 警告
- angular - 如何从 Angular 中的 Observable 中提取数据
- python - 我不知道如何混合我的 csv 代码。我会在下面告诉你我的意思
- c# - 如何根据发布配置更改硬编码变量?
- autohotkey - 如何设置由鼠标位置触发的按键?
- javascript - 在本地将 Firestore 子集合导出为 CSV 或 JSON