如何将数组作为TypeScript类型的允许键列表?
用数组元素作为对象类型键的实现方案
直接用普通数组没法实现,因为TypeScript会把普通数组的元素类型推断为宽泛的number,没法获取具体的键值。但通过const断言让数组变成只读字面量数组,再结合类型操作就能实现,包括你提到的「把数组作为类型参数」的泛型方案,具体如下:
基础实现:静态数组转键类型
- 首先用
as const断言数组,让TypeScript保留每个元素的具体字面量类型:
const myArray = [50, 100, 300, 500] as const;
- 用
typeof myArray[number]提取数组元素的联合类型,再通过映射类型定义对象:
type MyType = { [K in typeof myArray[number]]: { name: string; value: string }; };
此时MyType的键只能是50/100/300/500,完全符合需求。
最优方案:数组作为类型参数的泛型实现
如果需要复用这个逻辑,可以封装成泛型类型,把数组类型作为参数传入:
// 泛型接受只读数字数组类型,返回对应键类型的对象 type ArrayToObject<T extends readonly number[]> = { [K in T[number]]: { name: string; value: string }; }; // 使用时传入数组的类型 const myArray = [50, 100, 300, 500] as const; type MyType = ArrayToObject<typeof myArray>;
这种方式灵活性更高,只要是静态字面量数组,都可以传入泛型生成对应的对象类型。
注意事项
- 必须用
as const断言数组:普通数组会被推断为number[],无法获取具体的元素值类型;as const会把数组转为只读的字面量数组,让TypeScript保留每个元素的精确值。 - 数组元素必须是静态字面量:如果数组是动态生成的(比如从接口请求的数据),TypeScript无法推断出具体的元素值类型,这种情况下还是得用枚举或者手动定义联合类型。
内容的提问来源于stack exchange,提问作者eephyne
相关产品推荐
相关产品推荐

