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

如何在TypeScript中定义键为枚举部分成员的Record类型

如何在TypeScript中定义键为枚举部分成员的Record类型

嘿,我懂你现在的困扰——手里有个枚举,想做一个对象,它的键只需要用这个枚举里的部分成员,同时还要让TypeScript给这个对象加上正确的类型约束,对吧?我来给你拆解几种好用的方法:

首先先把你的枚举代码摆出来,方便对照:

enum Foo {
  A = "A",
  B = "B",
  C = "C"
}

你的目标对象大概是这样的,只用到了枚举里的A和B:

const Bar = {
  A: {/* 你的自定义内容 */},
  B: {/* 你的自定义内容 */}
}

方法1:明确指定允许的枚举成员(精准控制)

如果你已经确定了要用到枚举里的哪几个成员,直接把这些成员组成联合类型放到Record的第一个泛型参数里就行。不过要注意,Record<K, V>默认要求K里的所有键都必须出现在对象里,如果想让这些键是可选的,就搭配Partial工具类型。

比如先定义你对象值的类型,假设是{ id: number }:

type BarItem = { id: number };

// 要求必须包含A和B两个键
const Bar1: Record<Foo.A | Foo.B, BarItem> = {
  A: { id: 1 },
  B: { id: 2 }
  // 这里如果少写A或B,TypeScript会直接报错
};

// 允许包含A、B的任意子集(可以只写A,或者只写B,或者都写)
const Bar2: Partial<Record<Foo.A | Foo.B, BarItem>> = {
  A: { id: 1 }
  // 这里不写B也不会报错,完美符合“不一定包含所有”的需求
};

方法2:允许枚举的任意部分成员(灵活宽松)

如果你不想限制具体用哪几个枚举成员,只要对象的键是枚举里的成员就行,不管选多少个,那直接用Partial<Record<Foo, BarItem>>就可以了:

type BarItem = { id: number };

const Bar: Partial<Record<Foo, BarItem>> = {
  A: { id: 1 },
  C: { id: 3 }
  // 这里可以随便选Foo里的成员,想加A加A,想加C加C,完全自由
  // 但如果写个Foo里没有的键,比如D,TypeScript会立刻报错,帮你规避错误
};

方法3:用Pick工具类型(基于枚举的键名)

如果习惯用TypeScript的工具类型,也可以用Pick来选取枚举的部分键名,再组合成Record类型。比如只选取"A"和"B"这两个键名:

type BarItem = { id: number };
// Pick<typeof Foo, "A" | "B">会提取出Foo枚举中键名为A和B的部分
const Bar: Record<keyof Pick<typeof Foo, "A" | "B">, BarItem> = {
  A: { id: 1 },
  B: { id: 2 }
};
// 同样,如果要让键可选,就套上Partial:
const BarOptional: Partial<Record<keyof Pick<typeof Foo, "A" | "B">, BarItem>> = {
  B: { id: 2 }
};

这几种方法都能完美解决你的问题,你可以根据自己的实际需求选最顺手的那个~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:54:51