You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中从指定常量数组生成目标键值映射类型?

从const断言数组生成指定TypeScript对象类型

先看我们的输入常量数组:

const obj = [
    {
        key: 'fruit',
        value: ['apple', 'banana']
    },
    {
        key: 'meat',
        value: ['pork', 'chicken']
    }
] as const;

目标是生成这样的对象类型:

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

可以通过映射类型+索引访问类型组合实现,直接上代码:

方案一:封装成可复用类型

// 定义通用转换类型
type ArrayToKeyValObj<T extends readonly { key: string; value: readonly string[] }[]> = {
  [K in T[number]['key']]: Extract<T[number], { key: K }>['value'][number]
};

// 生成目标类型
type T = ArrayToKeyValObj<typeof obj>;

方案二:直接内联写法

如果不需要复用,也可以直接写:

type T = {
  [K in typeof obj[number]['key']]: Extract<typeof obj[number], { key: K }>['value'][number]
};

简单解释原理

  1. typeof obj[number]:把数组转成元素的联合类型,也就是{ key: 'fruit'; value: readonly ['apple', 'banana'] } | { key: 'meat'; value: readonly ['pork', 'chicken'] }
  2. [K in typeof obj[number]['key']]:遍历所有key值作为对象的属性名,也就是'fruit' | 'meat'
  3. Extract<typeof obj[number], { key: K }>:从联合类型里精准挑出当前key对应的元素类型
  4. ['value'][number]:把该元素的value数组转成元素值的联合类型,比如'apple' | 'banana'

这样就能完美得到你想要的类型了。

内容的提问来源于stack exchange,提问作者kkh.name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:30:05