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

如何在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                   // 空数组

类型原理说明

  1. 空对象处理:通过readonly [keyof T] extends readonly [never]判断对象是否为空,为空则返回空只读数组。
  2. 递归生成元组:遍历对象的每个键K,递归生成包含K和剩余键(通过Omit<T, K>移除已处理的键)的只读元组。
  3. 联合类型覆盖所有排列:通过[keyof T]索引遍历结果,得到所有键排列组合的元组联合类型,确保任意顺序的合法组合都被允许,同时拒绝重复、缺失的情况。
  4. as const的作用:将数组字面量推断为只读元组,与StrictKeysTuple返回的只读元组类型匹配。

内容的提问来源于stack exchange,提问作者gentlee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:32:10