基于变量的条件类型

问题描述 投票:0回答:1

我希望能够通过将一些变量传递给组件props来从“类型映射”之类的东西中选择正确的类型。我将其称为“条件类型”,但在打字稿文档的相应页面上找不到解决方案。

这里是一个简化的示例:

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]

经过一个小时的搜索,我一直没有找到正确的解决方案。也许我以某种错误的方式使用了打字稿?我很乐意提供帮助。

链接到playground

更新:我有一个可重用的通用react组件(表),该组件可以与不同类型的资源(Queue1,Queue2等)一起使用。我无法显式提供资源类型,因为它是动态的。因此,我所拥有的只是一个资源类型作为字符串,我需要以某种方式将其转换/转换为现有的打字稿类型。根据我最初的经验,它可能看起来像这样:/>(反应组件)

我最终采用了这种方法(感谢@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]>>
typescript typescript2.0
1个回答
0
投票

[您可以使用Record是一种对象类型,其属性键为K,属性值为T。也就是说,Record的键等于K,而Record [K]等于T。

type QueueTypes: Record<string, Queue1 | Queue2 | Queue3> = {
    'Queue1': Queue1,
    'Queue2': Queue2,
    'Queue2': Queue3
}
© www.soinside.com 2019 - 2024. All rights reserved.