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

如何将数组作为TypeScript类型的允许键列表?

用数组元素作为对象类型键的实现方案

直接用普通数组没法实现,因为TypeScript会把普通数组的元素类型推断为宽泛的number,没法获取具体的键值。但通过const断言让数组变成只读字面量数组,再结合类型操作就能实现,包括你提到的「把数组作为类型参数」的泛型方案,具体如下:

基础实现:静态数组转键类型

  1. 首先用as const断言数组,让TypeScript保留每个元素的具体字面量类型:
const myArray = [50, 100, 300, 500] as const;
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:09