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

React TypeScript:如何为带键数组的对象的对象定义类型(无需逐个命名键)

解决方案

先定义单个团队的类型:

interface Team {
  name: string;
  description: string;
}

要实现你需要的结构,最简单的方式是用索引签名结合显式声明的keys属性,但直接写索引签名有个小坑:TypeScript会把keys也当成Team类型的属性,所以更稳妥的是用Record工具类型加交叉类型:

type Teams = Record<string, Team> & {
  keys: string[];
};

这样定义后,就能按你给的示例正常使用了:

const teams: Teams = {
  team1: {
    name: 'team1',
    description: 'yada yada'
  },
  team2: {
    name: 'team2',
    description: 'yada yada'
  },
  keys: ['team1', 'team2']
};

// 遍历的时候不会有类型报错
teams.keys.forEach(key => {
  console.log(teams[key].name);
});

如果想要更严格的类型检查——比如确保keys数组里的每个元素都是对象里实际存在的键,可以用泛型来约束:

type Teams<T extends string> = Record<T, Team> & {
  keys: T[];
};

// 使用时指定具体的键联合类型
const teams: Teams<'team1' | 'team2'> = {
  team1: { name: 'team1', description: 'yada yada' },
  team2: { name: 'team2', description: 'yada yada' },
  keys: ['team1', 'team2']
};

这种情况下,要是你在keys里写了个不存在的键,TypeScript会直接给你报错,类型约束更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:21