如何自动生成包含全部keyList元素的TypeScript对象数组?
问题描述
现有 TypeScript 代码:
type keyList = 'a' | 'b' | 'c' type valueList = 'x' | 'y' | 'z'
想要创建一个对象数组,要求如下:
const arrayOfObjects:{key:keyList, value:valueList}[] = [ { key:'a', value:'x' },...
数组中的对象由 keyList 和 valueList 的元素组合而成,且 keyList 的每个元素在数组中至少出现一次,对应 valueList 的任意值。目前有近100个key,手动创建该数组十分繁琐,请问有没有自动生成的方法?
解决方法
可以通过运行时生成数组结合TypeScript类型约束来实现,无需手动逐个编写:
第一步:把TypeScript类型转化为运行时可用的数组
TypeScript类型仅存在于编译阶段,无法直接在运行时获取,所以需要先定义与类型对应的实际数组,再同步类型定义:// 运行时可用的key集合 const keys = ['a', 'b', 'c'] as const; // 运行时可用的value集合 const values = ['x', 'y', 'z'] as const; // 基于运行时数组同步类型定义,确保类型和实际值一致 type keyList = typeof keys[number]; type valueList = typeof values[number];第二步:生成满足要求的数组
根据需求不同,有三种常见生成方式:- 基础生成:每个key至少出现一次,对应默认value(比如第一个value)
const baseArray = keys.map(key => ({ key, value: values[0] })) as { key: keyList, value: valueList }[];- 全组合生成:生成key和value的所有可能组合(自动包含每个key至少一次)
const fullCombinationArray = keys.flatMap(key => values.map(value => ({ key, value })) ) as { key: keyList, value: valueList }[];- 自定义生成:允许指定部分key的特定value,其余用默认值
function generateKeyArray(customPairs?: Partial<Record<keyList, valueList>>) { return keys.map(key => ({ key, value: customPairs?.[key] ?? values[0] })) as { key: keyList, value: valueList }[]; } // 使用示例:指定a的value为y,其余key用默认的x const customArray = generateKeyArray({ a: 'y' });
这样不管key数量有多少,只需要维护keys和values两个数组,就能自动生成符合要求的对象数组,彻底省去手动编写的麻烦。
内容的提问来源于stack exchange,提问作者jdiablo
相关产品推荐
相关产品推荐

