如何在TypeScript中获取对象键的只读数组类型?
实现严格包含对象所有键的只读数组类型
普通的(keyof T)[]类型只能约束数组元素为对象的键,但无法限制数组必须包含全部键、无重复。以下是满足需求的TypeScript类型实现方案:
完整实现代码
type User = {}; type Bank = {}; type Data = { user: User bank: Bank } // 工具类型:生成包含对象所有键的严格只读元组(无重复、无缺失) type StrictKeysTuple<T extends object> = readonly [keyof T] extends readonly [never] ? readonly [] : { [K in keyof T]: readonly [K, ...StrictKeysTuple<Omit<T, K>>] }[keyof T] // 定义符合要求的键数组类型 type Keys = StrictKeysTuple<Data> // 合法示例(无报错) const validKeys1: Keys = ['user', 'bank'] as const const validKeys2: Keys = ['bank', 'user'] as const // 非法示例(均会触发编译报错) const duplicateKeys: Keys = ['user', 'user'] as const // 重复键 const missingKeys: Keys = ['user'] as const // 缺失键 const emptyKeys: Keys = [] as const // 空数组
类型原理说明
- 空对象处理:通过
readonly [keyof T] extends readonly [never]判断对象是否为空,为空则返回空只读数组。 - 递归生成元组:遍历对象的每个键
K,递归生成包含K和剩余键(通过Omit<T, K>移除已处理的键)的只读元组。 - 联合类型覆盖所有排列:通过
[keyof T]索引遍历结果,得到所有键排列组合的元组联合类型,确保任意顺序的合法组合都被允许,同时拒绝重复、缺失的情况。 as const的作用:将数组字面量推断为只读元组,与StrictKeysTuple返回的只读元组类型匹配。
内容的提问来源于stack exchange,提问作者gentlee
相关产品推荐
相关产品推荐

