有没有办法在打字稿中声明使用值作为键?

问题描述 投票:0回答:1
const obj = [
    {
        key: 'fruit',
        value: ['apple', 'banana']
    },
    {
        key: 'meat',
        value: ['pork', 'chicken']
    }
] as const;

我想生成类型

type T = {
    'fruit': 'apple' | 'banana',
    'meat': 'pork' | 'chicken'
}

我搜索过,但找不到如何使用值作为键。 如何从对象生成类型?

typescript mapped-types keyof
1个回答
0
投票

是的,您可以使用带有键重映射的映射类型来迭代obj数组的元素类型对应的union

的成员,并将
"key"
属性映射到键和元素类型
"value"
 属性的值:

type Tee = { [O in typeof obj[number] as O["key"]]: O["value"][number] } /* type Tee = { fruit: "apple" | "banana"; meat: "pork" | "chicken"; } */
请注意,您需要 

typeof 类型运算符

 来获取 
obj 值的类型,并且需要
索引访问类型
来获取特定类型键处的值的类型。因此,如果 O 是具有
key
 value
属性的对象,则
O["key"]
key
属性的类型,而
O["value"]
value
属性的类型。对于数组,使用
number
(例如
(typeof obj)[number]
(O["value"])[number]
)索引可以提供元素类型(或者它们的并集,如果它是异构数组)。

Playground 代码链接

© www.soinside.com 2019 - 2024. All rights reserved.