如何使用键数组快速定义所有键为同类型的TypeScript类型
完全可以,TypeScript 提供了内置的映射类型语法可以实现这个需求,不需要手动逐个声明属性。
实现方式
1. 直接用键字面量联合生成类型
如果已经明确所有键名,可以直接用内置的Record工具类型实现:
// 先定义所有允许的键名的联合类型 type ParamKeys = 'gdp' | 'interest' | 'inflation' // 生成所有值为number的对象类型,和你手动逐个写的效果完全一致 type Params = Record<ParamKeys, number>
2. 从已有的键名数组推导类型
如果你已经提前写好了键名的数组常量,可以直接从数组推导类型,不需要重复写联合类型:
// 数组后加 as const 让 TypeScript 保留精确的字面量类型,而不是推断为宽泛的 string[] const PARAM_KEYS = ['gdp', 'interest', 'inflation'] as const // 从数组提取所有键的联合类型 type ParamKey = typeof PARAM_KEYS[number] // 生成最终的参数类型 type Params = Record<ParamKey, number>
补充说明
以上两种方式生成的Params类型,和你手动编写的{gdp: number, interest: number, inflation: number}完全等价。后续新增参数键只需要更新联合类型或者键名数组即可,不需要逐个修改类型定义。
- 从数组推导时不能省略
as const,否则 TypeScript 会把数组推断为string[]类型,最终生成的参数类型会变成无键名限制的Record<string, number>,失去类型校验作用。 - 如果需要在同一类型里加其他不同类型的属性,可以用交叉类型扩展:
type Params = Record<ParamKey, number> & { remark: string enableLog: boolean }
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

